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.