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

Obsługa błędów w makrach

Termin Definicja
Obsługa błędów w makrach

Obsługa błędów w makrach to konstrukcje języka VBA przechwytujące wyjątki zamiast przerywać wykonanie kodu.

Mechanizm przechwytywania wyjątków w VBA

Obsługa błędów w makrach VBA służy do kontrolowania sytuacji, w których instrukcja nie może zostać wykonana poprawnie. Błąd może wystąpić na przykład podczas otwierania nieistniejącego pliku, odwołania do arkusza o innej nazwie, próby zapisu w lokalizacji bez uprawnień albo konwersji tekstu na liczbę. Bez odpowiedniej obsługi wykonanie procedury zostaje przerwane, a użytkownik otrzymuje komunikat programu z numerem i opisem błędu. Konstrukcja On Error pozwala określić, co VBA ma zrobić po wystąpieniu takiego zdarzenia.

Instrukcja On Error GoTo Etykieta kieruje wykonanie do wskazanego fragmentu procedury, gdy pojawi się błąd. On Error Resume Next powoduje przejście do następnej instrukcji, a On Error GoTo 0 wyłącza aktywną obsługę błędów w bieżącej procedurze. Ważne jest, że ustawienie nie jest globalne dla całego projektu: obowiązuje w procedurze, w której zostało wykonane, i nie zastępuje automatycznej kontroli poprawności danych.

On Error, Err i bezpieczny przepływ procedury

Po przechwyceniu błędu kod może odczytać informacje z obiektu Err. Właściwość Err.Number zawiera numer błędu, Err.Description jego opis, a Err.Source może wskazywać źródło zgłoszenia. Metoda Err.Clear usuwa zapisane informacje o błędzie, ale nie włącza ani nie wyłącza trybu obsługi. Dlatego po zakończeniu krótkiego fragmentu używającego On Error Resume Next należy jawnie wykonać On Error GoTo 0, aby kolejny błąd nie został przypadkowo zignorowany.

Typowy układ procedury obejmuje część roboczą, przejście Exit Sub lub Exit Function przed sekcją obsługi oraz etykietę błędu na końcu. Przykładowo kod może zapisać nazwę procedury, numer błędu i opis, a następnie zakończyć działanie w kontrolowany sposób. Bez instrukcji wyjścia poprawnie wykonana procedura spadłaby do etykiety obsługi i mogłaby wyświetlić komunikat o błędzie mimo braku błędu. W funkcji należy dodatkowo zdecydować, czy zwrócić wartość domyślną, czy przekazać błąd wyżej.

Instrukcja On Error Resume Next jest przydatna przy pojedynczej operacji, której rezultat ma zostać sprawdzony przez kod, na przykład przy próbie pobrania istniejącego obiektu. Nie powinna obejmować całej rozbudowanej procedury. W takim przypadku każda kolejna instrukcja może wykonać się na niepoprawnych danych, a rzeczywista przyczyna problemu zostanie przesłonięta. Po operacji należy sprawdzić Err.Number albo wynik działania, wykonać zaplanowaną reakcję i wyłączyć tymczasowy tryb.

Rozróżnianie błędów i odzyskiwanie danych

Dobra obsługa błędów nie ogranicza się do wyświetlenia tekstu „wystąpił błąd”. Reakcja powinna zależeć od rodzaju problemu. Brak pliku może oznaczać konieczność poproszenia o właściwą ścieżkę, nieistniejący arkusz wymaga sprawdzenia nazwy, a błąd zapisu może wynikać z blokady pliku lub braku dostępu do katalogu. Kod może porównać Err.Number z oczekiwanym numerem, ale należy robić to tylko wtedy, gdy sytuacja została wcześniej jednoznacznie zidentyfikowana. Nie wolno traktować każdego błędu jako sygnału, że operacja się udała.

Makro powinno sprawdzać dane przed wykonaniem operacji, zamiast polegać wyłącznie na przechwytywaniu wyjątków. Przed użyciem wartości z komórki warto zweryfikować, czy nie jest pusta i czy ma właściwy typ, na przykład przez IsNumeric lub IsDate. Przed odwołaniem do obiektu można sprawdzić, czy zmienna nie jest równa Nothing. Przy pracy z plikami należy potwierdzić istnienie ścieżki, a przy arkuszach sprawdzić, czy wymagany obiekt znajduje się w kolekcji. Walidacja ogranicza liczbę błędów i ułatwia wskazanie miejsca, w którym dane przestały być poprawne.

W procedurach modyfikujących skoroszyt trzeba również przewidzieć stan częściowego wykonania. Jeżeli makro zmieniło kilka arkuszy, a następnie napotkało błąd, użytkownik może otrzymać plik zawierający tylko część oczekiwanych zmian. Sekcja obsługi może przywrócić ustawienia aplikacji, zamknąć tymczasowo otwarty plik lub usunąć utworzony obiekt, ale działania porządkowe powinny być warunkowe i same odporne na błędy. Przydatne jest zapamiętanie stanu przed operacją, na przykład aktywnego arkusza, trybu obliczeń albo wartości włączonych wcześniej ustawień.

Testowanie makra po wystąpieniu błędu

Sprawdzanie obsługi błędów wymaga wywołania także scenariuszy nieprawidłowych. Należy przetestować pustą komórkę, tekst zamiast liczby, brak pliku, zmienioną nazwę arkusza, plik otwarty w trybie tylko do odczytu oraz przerwanie operacji przez użytkownika, jeśli makro korzysta z okien dialogowych. W każdym przypadku powinno być jasne, czy procedura kończy się bezpiecznie, ponawia operację, pomija konkretny rekord, czy zgłasza problem do dalszej analizy.

Podczas diagnozowania można używać punktów przerwania, wykonywania kodu instrukcja po instrukcji oraz okna Immediate w edytorze VBA. Warto obserwować wartości zmiennych, aktualną instrukcję i zawartość obiektu Err. Sam komunikat wyświetlany przez MsgBox nie zastępuje rejestrowania informacji potrzebnych do odtworzenia problemu. Komunikat dla użytkownika powinien być zrozumiały, natomiast zapis diagnostyczny może zawierać nazwę procedury, numer błędu, opis oraz identyfikator przetwarzanego pliku lub rekordu.

Po poprawce trzeba sprawdzić zarówno przypadek błędny, jak i normalny przebieg makra. Niewłaściwie umieszczone On Error GoTo 0 może wyłączyć obsługę zbyt wcześnie, a brak Exit Sub może skierować prawidłowy przebieg do sekcji awaryjnej. Trzeba także upewnić się, że procedura nie pozostawia aplikacji z wyłączonym odświeżaniem ekranu, zmienionym trybem obliczeń albo otwartym plikiem pomocniczym. Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnozowaniem problemów z makrami VBA, konfiguracją środowiska Office oraz sprawdzaniem działania podzespołów wykorzystywanych podczas pracy.

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