Strona 1 z 1

[Solved]Uruchamianie kilku makr

: śr sty 09, 2013 10:33 am
autor: szybkibill123
Mam problem
Mam kilka makr które muszę wywołać. Nie ma dla mnie znaczenia czy na raz czy po kolei, ale nie mogę znaleźć sposobu żeby zrobić to w jednym czasie. Jedyną opcją jest przypisanie do każdego makra osobnego guzika i wciskanie ich po kolei. Czy istnieje sposób na odpalenie tych makr na raz ?

Re: Uruchamianie kilku makr

: śr sty 09, 2013 10:37 am
autor: belstar
Instrukcja Call - sprawdź w pomocy

Kod: Zaznacz cały

Sub Pierwsze()
print "pierwsze makro"
drugie()
end sub

sub drugie()
print "drugie makro"
trzecie()
end Sub

sub trzecie()
print "trzecie makro"
end sub

Re: Uruchamianie kilku makr

: śr sty 09, 2013 11:34 am
autor: szybkibill123
niestety nie wiem czemu, ale nie działa. Jak mają być umieszczone makra ? W modułach arkusza na którym pracuję, czy w moich makrach ? Dodam że są to dwa makra kopiujące z jednego arkusza do dwóch różnych>

Re:Uruchamianie kilku makr

: śr sty 09, 2013 10:13 pm
autor: belstar
Tak naprawdę nie powinno to mieć znaczenia gdzie trzymasz te makra, jeśli w dokumencie powinno zawsze działać , jeśli w jakiejś innej bibliotece to powinna być ona przed uruchomieniem makra załadowana, ale wtedy dostaniesz odpowiedni komunikat.

Kod: Zaznacz cały

Sub Load_Biblioteke
 BasicLibraries.LoadLibrary("Twoja Biblioteka")
End Sub
szybkibill123 pisze:Dodam że są to dwa makra kopiujące z jednego arkusza do dwóch różnych>
Sprecyzuj.
Czy to są dwa różne arkusze tego samego dokumentu?

Niekiedy między wywołaniami makr trzeba wprowadzić celowe opóźnienie.
Np. makro drukuje oryginał faktury i kopie, pomiędzy wywołaniami drukowania zmienia zawartość komórki (oryginał/kopia) i w tym wypadku bez opóźnienia wydrukuje tylko oryginał (przynajmniej tak jest u mnie).

Spróbuj zastosować instrukcję Wait

Kod: Zaznacz cały

wait 2000 ' dwie sekundy

Re: Uruchamianie kilku makr

: sob sty 12, 2013 9:22 am
autor: szybkibill123
Trochę bardziej się rozpiszę i otworzę ponownie wątek bo jednak mam problemy. To jest tak. Mam jeden dokument w którym są cztery arkusze. Jeden arkusz jest tym z którego kopiowane są dane, ale po kopiowaniu nic się w nim nie zmienia. Chodzi o to że chcę te dane skopiować do dwóch różnych arkuszy ale w tym samym dokumencie. Sęk w tym że są to różne zakresy danych więc użyłem dwóch makr. Teraz nie wiem jak je wywołać jednocześnie, bo każde uruchamiane z osobna działa. Dodam jeszcze że problem nie polega na wywalaniu jakiegokolwiek błędu. Po prostu makro jakby się uruchamiało, ale nie uruchamiało tych dwóch pod-makr. Nie wiem czy to ja coś źle wpisuję albo popełniam inny błąd, ale nie działa.

Re: Uruchamianie kilku makr

: wt sty 22, 2013 1:58 pm
autor: kerim
Witam

Prawdopodobnie po wykonaniu jednego makra nie wykonujesz powrotu do Arkusza z ktorego chcesz kopiowac i drugie makro wykonuje sie ale w niewlasciwym Arkuszu.
Nalezy wrocic do wlasciwego Arkusza np:
ThisComponent.CurrentController.Select(ThisComponent.Sheets.getByName("Arkusz2").getCellRangeByName("A1"))
lub
ThisComponent.CurrentController.setActiveSheet(ThisComponent.Sheets.getByName("Arkusz2"))

Pozdrawiam
Kerim

Re: Uruchamianie kilku makr

: wt sty 22, 2013 9:19 pm
autor: szybkibill123
niestety to nie to ponieważ żadne makro się nie wykonuje niezależnie od tego w jakiej kolejności ma być wykonane

Re: Uruchamianie kilku makr

: wt sty 22, 2013 10:00 pm
autor: Jan_J
Spróbuj debuggerem. Narzędzia/makro/edycja, stań na podprogramie których chcesz uruchomić i wciskaj F8. Będziesz przesuwać się o jedną instrukcję. W międzyczasie sprawdzaj, co się dzieje z Twoimi zmiennymi. Posiadanie rozszerzenia X-Ray albo MRI ułatwi podgląd.

Albo podeślij kod z nieuruchamiającymi się makrami, wypranymi z poufnej zawartości. Bo zgadywać nikomu się nie chce.

Re: Uruchamianie kilku makr

: wt sty 22, 2013 10:18 pm
autor: szybkibill123

Kod: Zaznacz cały

sub Kopiuj
	Dim Gdzie As String
	oDoc = ThisComponent
	oSheet = oDoc.Sheets.getByName("")
	oSourceRange = oSheet.getCellRangeByName("A1;B1")
	oDataArray = oSourceRange.getDataArray
   
	oDestSheet = oDoc.Sheets.getByName("")
	Gdzie = trim(str(getCountA(oDestSheet) + 14))
	Gdzie = "A" & Gdzie & ":B" & Gdzie
	oDestRange = oDestSheet.getCellRangeByName(Gdzie)
	oDestRange.setDataArray(oDataArray)
   'nadanie kolejnego numeru
	oSheet.getCellRangeByName("B5").setValue(oSheet.getCellRangeByName("B5").getValue + 1)
	'Usuwanie zawartości
	With com.sun.star.sheet.CellFlags
		flagi = .STRING + .VALUE '+ .DATETIME + .FORMULA
	End With



end sub

Function getCountA(arkusz)
	oFunct = createUnoService( "com.sun.star.sheet.FunctionAccess" )
	oRange = arkusz.getCellRangeByName("C1:C10")
	getCountA = oFunct.callFunction("COUNTA" , ARRAY(oRange)) 
End Function


to jest kod makra, mam takie dwa i nie wiem jak zrobić żeby uruchamiały się po sobie kopiując do różnych arkuszy podobne zakresy

Re: Uruchamianie kilku makr

: wt sty 22, 2013 11:19 pm
autor: belstar
Wybacz u mnie związanie dwóch makr działa.

Czy celowo usunąłeś nazwy arkuszy?
W tej lini (jaki zakres) - powinien być użyty dwukropek nie średnik.

Kod: Zaznacz cały

 oSourceRange = oSheet.getCellRangeByName("A1;B1")
Wstawiam swoje działające związanie (uruchamiane z kopiuj_1)

Kod: Zaznacz cały

sub Kopiuj_1
       Dim Gdzie As String
       oDoc = ThisComponent
       oSheet = oDoc.Sheets.getByName("Arkusz1")
       oSourceRange = oSheet.getCellRangeByName("A1:B1")
       oDataArray = oSourceRange.getDataArray
       
       oDestSheet = oDoc.Sheets.getByName("Arkusz2")
       Gdzie = trim(str(getCountA(oDestSheet) + 14))
       Gdzie = "A" & Gdzie & ":B" & Gdzie
       oDestRange = oDestSheet.getCellRangeByName(Gdzie)
       oDestRange.setDataArray(oDataArray)
       'nadanie kolejnego numeru
       oSheet.getCellRangeByName("B5").setValue(oSheet.getCellRangeByName("B5").getValue + 1)
       'Usuwanie zawartości
       With com.sun.star.sheet.CellFlags
          flagi = .STRING + .VALUE '+ .DATETIME + .FORMULA
       End With

	Kopiuj_2

    end sub

    Function getCountA(arkusz)
       oFunct = createUnoService( "com.sun.star.sheet.FunctionAccess" )
       oRange = arkusz.getCellRangeByName("A1:A100")
       getCountA = oFunct.callFunction("COUNTA" , ARRAY(oRange))
    End Function

 sub Kopiuj_2
       Dim Gdzie As String
       oDoc = ThisComponent
       oSheet = oDoc.Sheets.getByName("Arkusz1")
       oSourceRange = oSheet.getCellRangeByName("A1:B1")
       oDataArray = oSourceRange.getDataArray
       
       oDestSheet = oDoc.Sheets.getByName("Arkusz3")
       Gdzie = trim(str(getCountA(oDestSheet) + 14))
       Gdzie = "A" & Gdzie & ":B" & Gdzie
       oDestRange = oDestSheet.getCellRangeByName(Gdzie)
       oDestRange.setDataArray(oDataArray)
       'nadanie kolejnego numeru
       oSheet.getCellRangeByName("B5").setValue(oSheet.getCellRangeByName("B5").getValue + 1)
       'Usuwanie zawartości
       With com.sun.star.sheet.CellFlags
          flagi = .STRING + .VALUE '+ .DATETIME + .FORMULA
       End With
    end sub

Re: Uruchamianie kilku makr

: śr sty 23, 2013 9:20 am
autor: szybkibill123
Dzięki bardzo, teraz działa, mam tylko jedno pytanie. Jak scalić dwa takie makra, jest to makro zapisujące.

Kod: Zaznacz cały

REM  *****  BASIC  *****
Option Explicit

' Katalog bazowy dokumentów
Const csBaseDocDir As String = "c:\Faktura"
Const csSheetName As String = "Faktura"
Const csNumberFormat As String = ""

Private sPathSep As String

' ========================================================
' SaveSheet
' ========================================================
Sub Zapisz_faktury
 Dim oDoc As Object
 Dim oSheet As Object
 Dim oCell As Object
 Dim dDate As Date
 Dim sDocNumber As String
 
 Dim sDateISO As String
 Dim sDirDay As String
 Dim sDirMonth As String
 Dim sDirYear As String
 Dim sDir As String

 sPathSep = GetPathSeparator()
 
 oDoc = ThisComponent
 oSheet = oDoc.Sheets.getByName(csSheetName)

 oCell = oSheet.getCellByPosition(0,0) ' B3 Data dok.
 dDate =  oCell.getValue()
 
 oCell = oSheet.getCellByPosition(0,1) ' F8 Numer dok.
 sDocNumber = oCell.getString() ' wartosc z formatowaniem
   
 sDateISO = CDateToISO(dDate)
 sDirDay = Right(sDateISO,2)
 sDirMonth = Mid(sDateISO, 5, 2)
 sDirYear = Left(sDateISO, 4)
 sDir = csBaseDocDir + sPathSep + sDirYear  +  _
                      sPathSep + sDirMonth +  _
                      sPathSep + sDirDay 
 SaveDocument sDir,  sDocNumber + ".ods"

End Sub

' ========================================================
' SaveDocument
' ========================================================
Sub SaveDocument( sDirName As String, sFileName As String )
  Dim args(0) As New com.sun.star.beans.PropertyValue
  Dim sURL As String
  
  MkDir(sDirName)
  
  sURL=ConvertToURL(sDirName + sPathSep + sFileName)
  ThisComponent.storeToURL(sURL, args())
End Sub