Jedną z moich ulubionych funkcjonalności w VBA są zdarzenia obiektu. Świetną sprawą jest możliwość uruchomienia makra nie tylko przez przycisk. Można to robić automatycznie. w momencie zajścia określonego zdarzenia (np. otwarcia pliku, zapisania zmian, podglądu wydruku).
Zdarzenia Arkusza i Skoroszytu
Możemy reagować na zdarzenia występujące w pojedynczym arkuszu (np. aktywacja i deaktywacja, przeliczenie formuł, zmiana wartości, zmiana zaznaczenia).
Możemy także reagować na zdarzenia występujące w obrębie pojedynczego pliku. Oprócz otwarcia i zamknięcia otrzymujemy całą gamę innych zdarzeń (instalacja i deinstalacja dodatku, dodanie nowego arkusza, zmiana rozmiarów okna).
Zdarzenia Aplikacji
Możemy zatem reagować na zmiany występujące w obrębie arkusza jak i skoroszytu. Można sięgnąć jednak jeszcze dalej i reagować na zdarzenia, które wystąpiły na poziomie całej aplikacji.
Żeby jednak to zrobić, musimy napisać własną klasę, a dokładniej – utworzyć obiekt, której właściwością będzie obiekt Excela.
Obiekt CAplikacja
Mój nowy obiekt nazwałem CAplikacja – posiada on jedną właściwość Aplikacja. Poprzedzenie nazwy właściwości słowem WithEvents powoduje, że można jej przypisać zdarzenia dla tego obiektu (tutaj jest to Application).
Słowo Public oznacza zmienną publiczną ponieważ chcemy aby nasza właściwość Aplikacja była widoczna z poziomu zwykłego modułu.
Aktywacja Dowolnego Arkusza
Moją intencją jest aby w momencie aktywacji arkusza dowolnego skoroszytu wyświetlała się informacja z nazwą jednego i drugiego – stąd też wykorzystałem zdarzenie Aplikacja_SheetActivate.
Moduł klasy wygląda więc tak:
Public WithEvents Aplikacja As Excel.Application
Private Sub Aplikacja_SheetActivate(ByVal Sh As Object)
MsgBox "Aktywacja pliku " & vbTab & Sh.Parent.Name & vbCr & _
"w arkuszu " & vbTab & Sh.Name, _
vbInformation, "Informacja"
End Sub
W module zwykłym tworzę nowy egzemplarz klasy CAplikacja i przypisuję jego jedynej właściwości Aplikacja odwołanie do sesji Excela.
Public clsAplikacja As CAplikacja
Sub UtworzKopieObiektu()
Set clsAplikacja = New CAplikacja
Set clsAplikacja.Aplikacja = Application
End Sub
Screen
Aby okienko z komunikatem MsgBox się wyświetlało konieczne jest wcześniejsze uruchomienie procedury NewObjectCopy (standardowo wykonuje się to w momencie otwarcia pliku z kodem makra).
W ten sposób utworzyliśmy prostą klasę, która pozwala nam na uzyskanie informacji o tym jaki arkusz i jaki plik jest w danym momencie aktywny.

