Możliwość korzystania ze zdarzeń skoroszytu i arkusza pozwala uruchomić makro automatycznie. Do dyspozycji mamy całą gamę zdarzeń związanych z aktywacją, deaktywacją, zmianą zaznaczenia, przeliczaniem itd. Zdarzenia poziomu aplikacji nie są jednak dostępne z poziomu Excela. W tym celu musimy napisać własną klasę.
Zdarzenia arkusza i skoroszytu
Możemy reagować na zdarzenia występujące w pojedynczym arkuszu. Do najpopularniejszych należą: aktywacja i deaktywacja, przeliczenie formuł, zmiana wartości i 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ń m.in. instalacja i deinstalacja dodatku, dodanie nowego arkusza, zmiana rozmiarów okna.
Zdarzenia aplikacji
Z poziomu Excela możemy reagować na zdarzenia zachodzące w obrębie arkusza i skoroszytu. Możemy jednak sięgnąć dalej i zareagować na zdarzenia, które wystąpiły na poziomie całej aplikacji.
Żeby to zrobić, musimy napisać własną klasę, a dokładniej – utworzyć obiekt, którego właściwością będzie cała aplikacja Microsoft Excel.
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 to, że możemy jej przypisać zdarzenia dla tego obiektu. Dzięki temu będziemy mogli przechwytywać zdarzenia poziomu aplikacji.
Słowo Public oznacza zmienną publiczną ponieważ chcemy aby właściwość Aplikacja była widoczna z poziomu zwykłego modułu.
Aktywacja dowolnego arkusza
Moją intencją jest to, aby w momencie aktywacji dowolnego arkusza, wyświetlała się informacja z jego nazwą i nazwą pliku. Do tego celu wykorzystałem zdarzenie Aplikacja_SheetActivate.
Moduł klasy wygląda więc tak:
1 2 3 4 5 6 7 8 9 |
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.
1 2 3 4 5 6 7 8 |
Public clsAplikacja As CAplikacja Sub UtworzKopieObiektu() Set clsAplikacja = New CAplikacja Set clsAplikacja.Aplikacja = Application End Sub |
Screen z rozwiązaniem
Aby okienko z komunikatem MsgBox się wyświetlało, konieczne jest wcześniejsze uruchomienie procedury UtworzKopieObiektu. Możemy ją umieścić np. w zdarzeniu WorkbookOpen.
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.