Makro po otwarciu arkusza nie pliku
Makro po otwarciu arkusza nie pliku
Witam
Napisałem makro i chciałbym aby uruchamiało się automatycznie po otwarciu arkusza. W narządziach "dostosuj" nie ma takiej opcji . Jest jedynie opcja uruchamiania danego polecenia po otwarciu pliku ale mi nie o to chodzi. Załużmy że plik jest otwarty i dopiero jak wchodzę na Arkusz2 to powinno się urochamiac makro.
Czy jest na to jakiś sposób?
Napisałem makro i chciałbym aby uruchamiało się automatycznie po otwarciu arkusza. W narządziach "dostosuj" nie ma takiej opcji . Jest jedynie opcja uruchamiania danego polecenia po otwarciu pliku ale mi nie o to chodzi. Załużmy że plik jest otwarty i dopiero jak wchodzę na Arkusz2 to powinno się urochamiac makro.
Czy jest na to jakiś sposób?
OpenOffice 3.2 na Windows XP/Vista
Re: Makro po otwarciu arkusza nie pliku
Trzeba ustawić nasłuch zdarzenia i podpiąć do niego akcję. Odpowiednia struktura nazywa się Event Listener.
http://wiki.services.openoffice.org/wik ... /Listeners
http://wiki.services.openoffice.org/wik ... d_Handlers
Bardziej na temat -- chyba nawet dokładnie to o co pytasz, ale nie sprawdzałem poprawności:
http://www.suite101.com/content/openoff ... hod-a64383
http://wiki.services.openoffice.org/wik ... /Listeners
http://wiki.services.openoffice.org/wik ... d_Handlers
Bardziej na temat -- chyba nawet dokładnie to o co pytasz, ale nie sprawdzałem poprawności:
http://www.suite101.com/content/openoff ... hod-a64383
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Makro po otwarciu arkusza nie pliku
Ok dzięki za odpowiedź,
A można prosić o przykład, np do takiego makra chce żeby się uruchomiło po wejściu na Arkusz1
A można prosić o przykład, np do takiego makra chce żeby się uruchomiło po wejściu na Arkusz1
Kod: Zaznacz cały
sub Przyklad
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$F$8"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "przykładowe słowo"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())
end sub
Ostatnio zmieniony ndz paź 03, 2010 9:20 pm przez Jan_J, łącznie zmieniany 1 raz.
Powód: zmiana formatowania kodu: znacznik [code]
Powód: zmiana formatowania kodu: znacznik [code]
OpenOffice 3.2 na Windows XP/Vista
Re: Makro po otwarciu arkusza nie pliku
Dobrze, ale na przykładzie podobnym do Twojego lecz nieco innym. Bo alergii dostaję na widok nagrywanych makr z odwołaniami do dispatchera UNO.
Mamy funkcję Przyklad(), którą chcemy podpiąć pod zdarzenie zmiany bieżącego arkusza.
Tworzymy więc obiekt nasłuchujący, który umie wywoływać funkcje rozpoczynające się słowem "Moje_" w sytuacji, kiedy obserwowna przez niego wartość się zmienia. Następnie wpinamy go w kontrolera, by raczył reagować na zmianę bieżącego arkusza. Wtedy wywołuje "Moje_nazwazdarzenia" -- ta funkcja z kolei jest opakowaniem dla naszej, spełniającym formalne wymogi przejęcia odpowiednich parametrów od obiektu wywołującego.
I jeszcze uwaga:
po każdym wymuszeniu zmiany arkusza listener wywołuje mi funkcję dwa razy. Nie wiem czemu tak jest ale żeby się zabezpieczyć wprowadziłem przełącznik myActiveSheet, który przepuszcza co drugie wywołanie. Głębsza wiedza na temat tego konkretnego zdarzenia (zmiana wartości ActiveSheet w kontrolerze interfejsu) pozwoliłaby uniknąć tego brzydkiego tricku.
Twoje zadanie wymaga nieco innej obsługiCiekawe, czy przy każdym z 2 wywołań warunek będzie spełniony? nie sądzę, ale nie sprawdzałem.
Aha! i na koniec ten nasłuch trzeba wywołać w makrze, które by się uruchomiło samo podczas otwarcia dokumentu.
Kod: Zaznacz cały
sub Przyklad()
rem zwiększa o 1 stan komórki A1 bieżącego arkusza
c= thisComponent.currentController.ActiveSheet.getCellByPosition(0,0)
c.setValue(c.getValue()+1)
end sub
Dim oListener As Object
rem globalna zmienna -- po co: patrz końcowy komentarz
Global myActiveSheet
Sub ustawListener
myActiveSheet = 0
oListener = createUnoListener ("Moje_","com.sun.star.beans.XPropertyChangeListener")
thisComponent.CurrentController.addPropertyChangeListener ("ActiveSheet",oListener)
End Sub
Sub Moje_propertyChange(oEvent)
myActiveSheet = 1 - myActiveSheet
if myActiveSheet = 1 then
przyklad()
end if
End Sub
Tworzymy więc obiekt nasłuchujący, który umie wywoływać funkcje rozpoczynające się słowem "Moje_" w sytuacji, kiedy obserwowna przez niego wartość się zmienia. Następnie wpinamy go w kontrolera, by raczył reagować na zmianę bieżącego arkusza. Wtedy wywołuje "Moje_nazwazdarzenia" -- ta funkcja z kolei jest opakowaniem dla naszej, spełniającym formalne wymogi przejęcia odpowiednich parametrów od obiektu wywołującego.
I jeszcze uwaga:
po każdym wymuszeniu zmiany arkusza listener wywołuje mi funkcję dwa razy. Nie wiem czemu tak jest ale żeby się zabezpieczyć wprowadziłem przełącznik myActiveSheet, który przepuszcza co drugie wywołanie. Głębsza wiedza na temat tego konkretnego zdarzenia (zmiana wartości ActiveSheet w kontrolerze interfejsu) pozwoliłaby uniknąć tego brzydkiego tricku.
Twoje zadanie wymaga nieco innej obsługi
Kod: Zaznacz cały
Sub Moje_propertyChange(oEvent)
if thisComponent.currentController.ActiveSheet.AbsoluteName = "tu nazwa arkusza" then
przyklad()
end if
End Sub
Aha! i na koniec ten nasłuch trzeba wywołać w makrze, które by się uruchomiło samo podczas otwarcia dokumentu.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Makro po otwarciu arkusza nie pliku
Wielkie dzięki za wyczerpującą odpowiedź.
Czy jest dostępny w sieci podręcznik do makr w OO ?
Widzę że muszę się sporo nauczyć
Czy jest dostępny w sieci podręcznik do makr w OO ?
Widzę że muszę się sporo nauczyć
OpenOffice 3.2 na Windows XP/Vista
Re: Makro po otwarciu arkusza nie pliku
Z tym są pewne problemy.
Tzw. Oficjalny podręcznik (http://helion.pl/ksiazki/openoffice_2_0 ... opof20.htm) nie obejmuje ani języków skryptowych, ani API.
Dokumentacja OpenOffice API (http://api.openoffice.org/docs/common/r ... le-ix.html) jest bardzo przydatna, ale nie jest podręcznikiem.
Andrew Pitonyak napisał (chyba) niezłą książkę http://www.pitonyak.org/book, a za free udostępnia bardzo obszerny zbiór przykładów http://www.pitonyak.org/oo.php.
Jest jeszcze bogaty zbiór przykładów w http://www.oooforum.org/ (grupy tematyczne Macros and Api; Code Snippets) -- dotyczą nie tylko Basica.
Podobnie, chociaż ubożej, jest w http://user.services.openoffice.org/en/forum/
Polskie fora zgromadziły o wiele mniejsze zasoby przykładów.
Tym się posługuję. Oczywiście do opanowania podstaw algorytmiki oraz języka programowania przydatna jest inna literatura, łatwiej dostępna i nie związana z OpenOffice.
Btw. Chyba przydałby się scentralizowany przewodnik po istniejących materiałach dotyczących programowania w OpenOffice z odnośnikami do książek, węzłów sieciowych i innych zasobów. Pomyślę nad tym, usystematyzowanie posiadanych źródeł wiedzy nie powinno kosztować wiele pracy.
Tzw. Oficjalny podręcznik (http://helion.pl/ksiazki/openoffice_2_0 ... opof20.htm) nie obejmuje ani języków skryptowych, ani API.
Dokumentacja OpenOffice API (http://api.openoffice.org/docs/common/r ... le-ix.html) jest bardzo przydatna, ale nie jest podręcznikiem.
Andrew Pitonyak napisał (chyba) niezłą książkę http://www.pitonyak.org/book, a za free udostępnia bardzo obszerny zbiór przykładów http://www.pitonyak.org/oo.php.
Jest jeszcze bogaty zbiór przykładów w http://www.oooforum.org/ (grupy tematyczne Macros and Api; Code Snippets) -- dotyczą nie tylko Basica.
Podobnie, chociaż ubożej, jest w http://user.services.openoffice.org/en/forum/
Polskie fora zgromadziły o wiele mniejsze zasoby przykładów.
Tym się posługuję. Oczywiście do opanowania podstaw algorytmiki oraz języka programowania przydatna jest inna literatura, łatwiej dostępna i nie związana z OpenOffice.
Btw. Chyba przydałby się scentralizowany przewodnik po istniejących materiałach dotyczących programowania w OpenOffice z odnośnikami do książek, węzłów sieciowych i innych zasobów. Pomyślę nad tym, usystematyzowanie posiadanych źródeł wiedzy nie powinno kosztować wiele pracy.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Makro po otwarciu arkusza nie pliku
Wersja 3.3 umożliwia przypisanie makra do otwarcia arkusza z menu arkusza.