Strona 1 z 1

Makro po otwarciu arkusza nie pliku

: ndz paź 03, 2010 11:55 am
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?

Re: Makro po otwarciu arkusza nie pliku

: ndz paź 03, 2010 6:36 pm
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

Re: Makro po otwarciu arkusza nie pliku

: ndz paź 03, 2010 7:07 pm
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

Re: Makro po otwarciu arkusza nie pliku

: ndz paź 03, 2010 9:53 pm
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.

Re: Makro po otwarciu arkusza nie pliku

: pn paź 04, 2010 8:21 am
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ć ;)

Re: Makro po otwarciu arkusza nie pliku

: śr paź 06, 2010 2:10 pm
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.

Re: Makro po otwarciu arkusza nie pliku

: sob paź 23, 2010 11:31 am
autor: jkwin
Wersja 3.3 umożliwia przypisanie makra do otwarcia arkusza z menu arkusza.