Strona 1 z 1

Listener ukrywania wierszy

: śr mar 22, 2017 6:39 pm
autor: s1w_
Potrzebuję oprogramować Listener do wykrywania zmian właściwości isVisible dla wierszy skoroszytu calc.

XEventListener ani XModifyListener nie wykrywają tych zmian

Kod: Zaznacz cały

Sub add_eventsListener
	Dim ePrefix As String, eService As String
	'oMouseCurrCont = ThisComponent.CurrentController
	
	ePrefix = "event_"
	eService = "com.sun.star.document.XEventListener"
	
	If IsNull(mEventHandler) Then
		mEventHandler = CreateUnoListener(ePrefix, eService)
		ThisComponent.addEventListener(mEventHandler)
	EndIf
End Sub

Sub event_notifyEvent(oEvent)
msgbox "event: " & oEvent.EventName 

End Sub

Re: Listener ukrywania wierszy

: czw mar 23, 2017 2:28 pm
autor: belstar
Krótkie śledztwo wykazało że może być problem, choć gwarancji nie daję.
Jedyne co mogę ci zaproponować to rozwiązanie problemu na około.
Gdzieś na forum (poszukaj sobie) wstawiłem plik z przykładem "suma_wg_koloru_komórki". Jest tam wśród wielu funkcji też funkcja UDF o nazwie CELL_VISIBLE(), zaimplementuj sobie ją gdzieś w głębokich otchłaniach arkusz, a listener dodaj na te komórki gdzie zwraca ona wynik swojego działania. Wynikiem jest 1 gdy komórka jest widoczna, także gdy wynik funkcji się zmieni, listener to wychwyci i uruchomi twoją procedurę. W przykładzie wywołanie funkcji jest otoczone funkcją JEŻELI() a to po to bo Calc sam z siebie nie przelicza funkcji CELL_XXX automatycznie.
I mała uwaga, w przykładzie funkcja JEŻELI() sprawdza czy TERAZ() = TERAZ(), kiedyś po dyskusji z Jan_J doszliśmy do bezpieczniejszego rozwiązania, mianowicie TERAZ() > 0. Także zastosuj poniższą formułę:

Kod: Zaznacz cały

=JEŻELI(TERAZ()>0;CELL_VISIBLE(ARKUSZ();WIERSZ(A1);KOLUMNA(A1));"")

Re: Listener ukrywania wierszy

: czw mar 23, 2017 3:11 pm
autor: s1w_
Jest to jakieś rozwiązanie, nie wiem czy kosztowo opłacalne (obliczanie funkcji basic z komórki robiło widoczne spowolnienie)

Hmm potrzebowałem tego do notyfikacji, czy wbudowany autofiltr został użyty <- korzystanie z niego nie robi eventow, też nie doszukałem się adekwatnego Listenera :/

ps. świetny pomysł z tą formułą, przyda się w wielu innych rzeczach

Re: Listener ukrywania wierszy

: pn mar 27, 2017 9:26 pm
autor: s1w_
Eureka! Mimo że nie osiągnąłem rezultatu z czystego BASIC'a, znalazłem genialną formułę, która się odnosi bezpośrednio do autofiltra!! i updateuje bez obejścia:

Kod: Zaznacz cały

"=SUBTOTAL(3;A2:A" & getLastRow(Sheet) + 1 & ")"
gdyby nie podpowiedź nie znalazłbym tego rozwiązania, także dzięki!

PL:

Kod: Zaznacz cały

=SUMY.CZĘŚCIOWE(3;A2:A100)
https://wiki.openoffice.org/wiki/Docume ... L_function