Error handling to mechanizm obsługi błędów w kodzie VBA, umożliwiający przechwycenie i reakcję na nieoczekiwane sytuacje.
Rola error handling w procedurze VBA
Error handling w języku VBA oznacza zaplanowany sposób reagowania procedury na błędy występujące podczas wykonywania kodu. Błąd może pojawić się między innymi przy próbie otwarcia nieistniejącego pliku, odwołaniu do nieprawidłowego arkusza, dzieleniu przez zero, użyciu obiektu, który nie został ustawiony, albo przekazaniu danych w formacie niezgodnym z oczekiwaniami. Bez obsługi błędu wykonanie makra zwykle zostaje przerwane, a użytkownik otrzymuje komunikat generowany przez środowisko VBA.
Podstawową instrukcją tego mechanizmu jest On Error. Konstrukcja On Error GoTo Etykieta wskazuje procedurę obsługi, do której program przejdzie po wystąpieniu błędu. On Error Resume Next nakazuje natomiast kontynuowanie wykonywania od instrukcji znajdującej się bezpośrednio po tej, która spowodowała błąd. Trzecia forma, On Error GoTo 0, wyłącza aktywną obsługę błędów w bieżącej procedurze i przywraca standardowe zgłaszanie kolejnych błędów.
Instrukcje On Error i przebieg sterowania
Typowy procedurę VBA z obsługą błędu buduje się z części wykonującej operację, etykiety handlera oraz kontrolowanego wyjścia z procedury. Przykładowy schemat może wyglądać następująco:
Sub OdczytajDane()
On Error GoTo ObslugaBledu
' instrukcje wykonujące operację
Exit Sub
ObslugaBledu:
' reakcja na błąd
End Sub
Instrukcja Exit Sub jest w takim układzie istotna, ponieważ zapobiega przypadkowemu przejściu do sekcji obsługi po prawidłowym zakończeniu głównej części procedury. W procedurze zwracającej wartość stosuje się odpowiednio Exit Function, a w procedurze właściwości — Exit Property. Etykieta wskazana przez On Error GoTo musi znajdować się w tej samej procedurze. Jeżeli błąd wystąpi w aktywnym handlerze, VBA nie wykorzystuje ponownie tego samego handlera; szuka obsługi w procedurze wywołującej, o ile taka obsługa została tam skonfigurowana.
On Error Resume Next powinno być używane lokalnie, przy operacji, której niepowodzenie jest przewidziane i możliwe do sprawdzenia. Po zakończeniu takiego fragmentu warto przywrócić zwykłe zgłaszanie błędów przez On Error GoTo 0. Pozostawienie trybu Resume Next aktywnego przez całą procedurę może ukryć błąd i pozwolić kodowi pracować na niepełnych albo nieprawidłowych danych.
Obiekt Err i rozróżnianie przyczyn awarii
Po wystąpieniu błędu VBA udostępnia informacje w obiekcie Err. Najczęściej wykorzystywane właściwości to Err.Number, zawierająca numer błędu, Err.Description, zawierająca opis tekstowy, oraz Err.Source, wskazująca źródło zgłoszenia. W zależności od sytuacji dostępne mogą być także Err.HelpFile i Err.HelpContext. Odczyt tych wartości pozwala zapisać szczegół diagnostyczny albo rozdzielić błędy oczekiwane od problemów wymagających przerwania procedury.
Reakcja na błąd powinna odpowiadać jego znaczeniu. Jeżeli brak pliku oznacza pominięcie opcjonalnego importu, kod może wyświetlić informację i zakończyć tę operację. Jeżeli natomiast nie udało się zapisać wyniku, dalsze wykonywanie makra może doprowadzić do niespójnego stanu i powinno zostać zatrzymane. Do celowego zgłaszania własnego błędu służy Err.Raise, które pozwala przekazać numer, opis i opcjonalne źródło błędu.
Przed ponownym użyciem obiektu Err można wyczyścić jego zawartość instrukcją Err.Clear. Nie usuwa ona jednak ustawienia trybu On Error; kasuje tylko informacje przechowywane w obiekcie błędu. W praktyce komunikat powinien powstawać dopiero po sprawdzeniu, że błąd rzeczywiście wystąpił, a kod nie powinien bezwarunkowo ignorować każdej wartości Err.Number. Rejestrowanie numeru, opisu i miejsca wystąpienia ułatwia ustalenie, czy problem wynika z danych, konfiguracji programu Office, pliku makra czy środowiska systemowego.
Error handling a diagnostyka makr Office
Nieprawidłowo zaprojektowany error handling może być przyczyną pozornie losowego działania makra. Szczególnie ryzykowne jest użycie On Error Resume Next bez natychmiastowego sprawdzenia rezultatu operacji. W takim przypadku instrukcja może nie wykonać się poprawnie, ale kolejne polecenia będą korzystać z obiektu o wartości Nothing, pustej zmiennej lub niekompletnego wyniku. Objawem może być brak danych w arkuszu, pominięty plik, nieaktualny raport albo komunikat pojawiający się dopiero w dalszej części procedury.
Podczas analizy problemu warto sprawdzić, gdzie w kodzie ustawiono On Error, czy handler ma prawidłową etykietę, czy po obsłudze następuje kontrolowane wyjście oraz jakie wartości mają właściwości obiektu Err. Pomocne jest także przejście przez kod w edytorze VBA krok po kroku i obserwowanie instrukcji, na której zmienia się przepływ sterowania. Jeżeli makro działa na plikach Excela, należy dodatkowo zweryfikować nazwy skoroszytów, arkuszy, zakresów i ścieżek, ponieważ ich zmiana często wywołuje błędy wykonania niezależnie od samej składni VBA.
Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnostyką problemów z oprogramowaniem biurowym oraz działaniem makr VBA na sprawnym komputerze. Analiza obejmuje rozróżnienie błędu kodu od problemu z systemem, instalacją pakietu Office, plikiem użytkownika lub konfiguracją środowiska.