Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

On Error Resume Next

Termin Definicja
On Error Resume Next

On Error Resume Next to instrukcja VBA pomijająca błąd i kontynuująca wykonanie — stosowana ostrożnie, bo ukrywa usterki.

Jak działa On Error Resume Next w VBA

On Error Resume Next jest instrukcją języka VBA służącą do zmiany sposobu reagowania procedury na błędy wykonania. Po jej wykonaniu błąd nie powoduje natychmiastowego przerwania procedury ani przejścia do osobnej etykiety obsługi błędu. Zamiast tego VBA kontynuuje wykonywanie od instrukcji znajdującej się bezpośrednio po tej, która wywołała błąd. Instrukcja działa od miejsca jej wystąpienia aż do końca bieżącej procedury albo do czasu zmiany ustawienia obsługi błędów.

Mechanizm dotyczy błędów występujących podczas wykonywania kodu, a nie błędów składniowych wykrywanych przed uruchomieniem procedury. Nie naprawia też przyczyny problemu i nie zmienia wartości, które miała zwrócić nieudana operacja. Jeżeli na przykład kod próbuje odwołać się do nieistniejącego arkusza, obiektu albo pliku, instrukcja może pozwolić na dalsze wykonywanie programu, ale obiekt lub wynik operacji pozostanie nieustalony. Kolejne instrukcje mogą więc pracować na wartości domyślnej, wartości poprzedniej albo obiekcie ustawionym na Nothing, zależnie od rodzaju operacji.

Obiekt Err jako kontrola skutku pominiętego błędu

Po wystąpieniu błędu VBA udostępnia informacje w globalnym dla bieżącego projektu obiekcie Err. Najczęściej analizuje się właściwości Err.Number, Err.Description, Err.Source oraz, w określonych sytuacjach, Err.HelpFile i Err.HelpContext. Numer wskazuje rodzaj błędu, a opis zawiera komunikat przekazany przez środowisko VBA lub przez kod wywołujący Err.Raise. Przy użyciu On Error Resume Next należy sprawdzić te właściwości bezpośrednio po instrukcji, która mogła się nie powieść.

Praktyczny schemat może wyglądać następująco: włączenie On Error Resume Next, wykonanie jednej konkretnej operacji, odczytanie Err.Number, zapisanie decyzji wynikającej z kontroli, a następnie wyłączenie trybu przez On Error GoTo 0. Obiekt Err można wyzerować metodą Err.Clear, gdy dalsza część procedury ma niezależnie sprawdzać kolejną operację. Samo wyłączenie obsługi przez On Error GoTo 0 nie powinno być traktowane jako pełna analiza wcześniejszego błędu. Jeżeli kod nie odczyta informacji z obiektu Err, przyczyna problemu może zostać utracona wśród kolejnych instrukcji.

Zakres działania i ryzyko ukrycia usterki

On Error Resume Next działa w obrębie procedury, w której została użyta. Obejmuje kolejne instrukcje tej procedury, ale nie jest globalnym ustawieniem dla całego projektu VBA. Po zakończeniu procedury ustawienie obsługi błędów przestaje obowiązywać w jej kontekście. Jeżeli procedura wywołuje inną procedurę, każda z nich powinna mieć świadomie zaprojektowaną własną obsługę błędów. W przeciwnym razie trudniej ustalić, w którym miejscu wystąpił problem i czy błąd został prawidłowo obsłużony.

Największym zagrożeniem jest zbyt szeroki zakres instrukcji. Gdy On Error Resume Next pozostaje aktywne przez wiele operacji, pominięciu może ulec zarówno oczekiwany przypadek braku obiektu, jak i poważniejsza awaria, na przykład nieprawidłowy typ danych, niedostępny plik albo błąd zapisu. Program może wtedy kontynuować pracę w stanie częściowo zmienionych danych. Późniejsze objawy pojawiają się w innym miejscu niż pierwotna przyczyna, co utrudnia debugowanie. Z tego powodu tryb powinien obejmować możliwie krótki fragment kodu, a po zakończeniu kontrolowanej operacji należy użyć On Error GoTo 0.

Instrukcja jest uzasadniona przede wszystkim wtedy, gdy brak określonego zasobu jest przewidzianym wariantem działania i kod potrafi jednoznacznie odróżnić taki przypadek od rzeczywistej awarii. Przykładem może być próba pobrania obiektu, który może nie istnieć, pod warunkiem że natychmiast po operacji sprawdzany jest wynik oraz numer błędu. W bardziej złożonej procedurze lepszym rozwiązaniem bywa On Error GoTo z etykietą obsługi, ponieważ pozwala zebrać informacje, uporządkować zakończenie operacji i przekazać błąd do wyższej warstwy kodu.

Znaczenie instrukcji przy diagnozowaniu aplikacji VBA

Podczas analizy programu korzystającego z makr VBA warto sprawdzić wszystkie miejsca występowania On Error Resume Next, a następnie ustalić, jakie instrukcje wykonują się pomiędzy jego włączeniem a On Error GoTo 0. Szczególnej uwagi wymagają operacje na skoroszytach, arkuszach, zakresach, plikach, formularzach, kolekcjach obiektów oraz danych pobieranych z zewnętrznych źródeł. Trzeba sprawdzić, czy po operacji kontrolowana jest właściwa własność obiektu, czy analizowany jest Err.Number i czy kod nie używa wyniku nieudanej instrukcji.

W diagnostyce pomocne jest odtworzenie sytuacji z wyłączonym pomijaniem błędów albo zastąpienie szerokiego zakresu krótkim, kontrolowanym blokiem. Należy jednak zachować ostrożność, ponieważ zatrzymanie na błędzie może ujawnić również przypadki, które autor makra celowo traktował jako dopuszczalne. Poprawa nie polega na mechanicznym usunięciu instrukcji, lecz na rozdzieleniu przewidywalnego braku zasobu od błędu wymagającego przerwania procedury. Warto także rejestrować numer i opis błędu, nazwę procedury oraz etap operacji, aby późniejsza analiza nie opierała się wyłącznie na końcowym komunikacie.

Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnostyką problemów z oprogramowaniem oraz makrami VBA uruchamianymi w typowych środowiskach biurowych. Przy ocenie takiego problemu analizuje się nie tylko sam komunikat, lecz także przepływ danych, kolejność wykonywania instrukcji, stan obiektów po pominiętym błędzie i sposób przywracania normalnej obsługi wyjątków.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę