W VBA możemy korzystać z procedur zdarzeniowych. Oznacza to, że makra mogą być uruchamiane automatycznie, w momencie zajścia określonego zdarzenia w obrębie arkusza lub skoroszytu. Niektóre zdarzenia posiadają parametr Cancel, który pozwala warunkowo przerwać działanie makra.
Samowyzwalanie makra
W VBA makra mogą się uruchamiać automatycznie, bez klikania w przycisk. Odbywa się to dzięki tzw. zdarzeniom poziomu arkusza lub skoroszytu. Istnieją również zdarzenia poziomu aplikacji, ale w tym celu musimy utworzyć własną klasę.
Do najbardziej popularnych należą: otwarcie i zamknięcie skoroszytu, aktywacja arkusza i zmiana wartości, zmiana zaznaczenia czy przeliczenie danych.
Praktyczny Cancel
Niektóre zdarzenia posiadają parametr Cancel, który pozwala określić warunek przerwania makra. Ma to swoje ogromne korzyści, o czym się przekonamy studiując przykłady.
Dobry programista powinien zawsze sprawdzić czy zostały spełnione wszystkie warunki do uruchomienia następnego kroku w aplikacji. Przykładowo. Przed przypisaniem zmiennej do arkusza – powinniśmy się upewnić, czy znajduje się on w skoroszycie. Przed wykonaniem obliczeń – musimy się upewnić, że w użytkownik uzupełnił niezbędne dane wejściowe.
Przerwanie makra
Sprawdźmy poniższe przykłady. Parametr Cancel ustawiony na TRUE pozwala zablokować możliwość dalszych działań, jeżeli nie zostały spełnione pewne warunki.
Zapis pliku pod inną nazwą
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) Dim iOdpowiedz As Long ' Gdy użytkownik chce zapisać plik pod nową nazwą If SaveAsUI Then ' Wyświetl komunikat, zapytaj czy chce zapisać zmiany w pliku iOdpowiedz = MsgBox("Nie można zapisać tego pliku pod inną nazwą. " & _ "Czy zapisać zmiany w pliku?", vbQuestion + vbOKCancel) ' Cancel = TRUE - przerywamy makro, Cancel = FALSE - zapisujemy plik Cancel = (iOdpowiedz = vbCancel) ' Zapisz zmiany If Cancel = False Then Me.Save ' Przerwij działanie makra (brak zapisu do innego pliku) Cancel = True End If End Sub |
Podgląd wydruku
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub Workbook_BeforePrint(Cancel As Boolean) ' Przerwij makro gdy imię lub nazwisko ' nie zostało podane If Sheet1.Range("Imie") = "" Or _ Sheet1.Range("Nazwisko") = "" Then MsgBox "Wypełnij wymagane komórki przed wydrukowaniem!", vbInformation Cancel = True End If End Sub |
Usunięcie paska narzędzi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim sPytanie As String Dim iOdpowiedz As Integer ' Zapytaj o zapisanie zmian gdy plik nie jest zapisany If Not ThisWorkbook.Saved Then sPytanie = "Czy zapisać zmiany w " & Me.Name & "?" iOdpowiedz = MsgBox(sPytanie, vbExclamation + vbYesNoCancel) Select Case iOdpowiedz Case vbYes ' Zapisz zmiany w pliku ThisWorkbook.Save Case vbNo ' Udaj, że zmiany zostały zapisane ThisWorkbook.Saved = True Case vbCancel ' Przerwij zamykanie pliku, zakończ makro Cancel = True Exit Sub End Select End If ' Skasuj własny pasek narzędzi On Error Resume Next CommandBars("test").Delete On Error GoTo 0 End Sub |