Makro po otwarciu arkusza nie pliku

Użytkowanie arkusza kalkulacyjnego
pruszko
Posty: 38
Rejestracja: czw lip 29, 2010 9:26 am

Makro po otwarciu arkusza nie pliku

Post autor: pruszko »

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?
OpenOffice 3.2 na Windows XP/Vista
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro po otwarciu arkusza nie pliku

Post autor: Jan_J »

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
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
pruszko
Posty: 38
Rejestracja: czw lip 29, 2010 9:26 am

Re: Makro po otwarciu arkusza nie pliku

Post autor: pruszko »

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

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]
OpenOffice 3.2 na Windows XP/Vista
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro po otwarciu arkusza nie pliku

Post autor: Jan_J »

Dobrze, ale na przykładzie podobnym do Twojego lecz nieco innym. Bo alergii dostaję na widok nagrywanych makr z odwołaniami do dispatchera UNO.

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
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ługi

Kod: Zaznacz cały

Sub Moje_propertyChange(oEvent)
  if thisComponent.currentController.ActiveSheet.AbsoluteName = "tu nazwa arkusza" then
    przyklad()
  end if
End Sub
Ciekawe, 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.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
pruszko
Posty: 38
Rejestracja: czw lip 29, 2010 9:26 am

Re: Makro po otwarciu arkusza nie pliku

Post autor: pruszko »

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ć ;)
OpenOffice 3.2 na Windows XP/Vista
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro po otwarciu arkusza nie pliku

Post autor: Jan_J »

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.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
jkwin
Posty: 28
Rejestracja: pt cze 12, 2009 5:57 pm

Re: Makro po otwarciu arkusza nie pliku

Post autor: jkwin »

Wersja 3.3 umożliwia przypisanie makra do otwarcia arkusza z menu arkusza.
ODPOWIEDZ