poniedziałek, 3 marca 2014

Wywołanie akcji w następstwie filtrowania

Zacznijmy od pytania: czy można wywołać akcję w wyniku zmiany parametrów filtrowania?
Doświadczeni programiści od razu zastanowią się, czy można zastosować odpowiednie zdarzenie w celu wykonania tej operacji lecz niestety, przynajmniej na moment tworzenia tego wpisu nie istnieje zdarzenie powiązane z działaniem filtra.

W jaki sposób moglibyśmy obejść ten problem? Odpowiedź jest dość prosta- należy wykorzystać inne zdarzenie, a konkretnie zdarzenie Calculate. W praktyce bowiem, przy każdej zmianie filtra następuje przeliczanie formuł komórkowych. Inne zdarzenia typu SelectionChange lub Change nie dadzą oczekiwanych rezultatów choćby dlatego, że filtr można wywołać samą myszą bez zmiany bieżącego zaznaczenia.

Zanim zaprezentuję kolejne etapy tego rozwiązania postawmy sobie cel: chcemy wywołać proste okno MsgBox z informacją, czy wynik filtrowania zwrócił jakieś dane czy też nie.

Krok 1. Nasze dane testowe, przyjmijmy, że mają następującą postać.



Krok 2. W arkuszu z danymi wstawmy przynajmniej jedną funkcję arkuszową, no chyba, że formuły już tam istnieją. Ja wstawię w komórce AA1 prostą funkcję zwracającą bieżącą datę i godzinę: = TERAZ()

Krok 3. Tworzymy zdarzenie Calculate dla arkusza z danymi. Proszę zwrócić uwagę na dodatkowe szczególne kryteria, parametry i założenia, które powinniśmy uwzględnić. Zaprezentowane zostały w postaci komentarzy w poniższym kodzie.

01Private Sub Worksheet_Calculate()
02Debug.Print Now
03 
04'zdarzenie Calculate wywoływane jest _
05 także wtedy, gdy aktywny jest inny arkusz
06'tu upewniamy się, że aktywny arkusz to _
07 arkusz z naszymi danymi
08 
09If ActiveSheet.Name = Me.Name Then
10    
11    'przyjmując założenie, że poniżej tabeli _
12     danych nie ma innych wartości po prostu _
13     sprawdzamy, czy nr wiersza w wyniku _
14     działania właściwości End (Ctrl + Strzałka)
15     
16    If Cells(Rows.Count, 1).End(xlUp).Row = 1 Then
17        MsgBox "Brak danych", , "Wynik filtrowania"
18    Else
19        MsgBox "Dane dostępne", , "Wynik filtrowania"
20    End If
21    
22End If
23End Sub

Krok 4. Wynik działania procedur prezentują poniższe zrzuty ekranu.




Uwaga końcowa! Co oczywiste wariant ten nie jest ani idealny, ani jedyny możliwy. W praktyce bowiem każde przeliczenie formuł również będzie skutkować wywołaniem powyższego zdarzenia. W zależności od okoliczności niezbędne będzie więc rozbudowanie mechanizmu o dalsze warunki i parametry.

Brak komentarzy:

Prześlij komentarz