VBA On Error - najlepsze praktyki obsługi błędów

Ściągawka z błędami VBA

Błędy

OpisKod VBAW przypadku błędu - kod zatrzymania i błąd wyświetlaniaW przypadku błędu Przejdź do 0W przypadku błędu - pomiń błąd i kontynuuj działaniePrzy błędzie Wznów DalejW przypadku błędu - przejdź do wiersza kodu [Etykieta]W przypadku błędu Przejdź do [Etykieta]Czyści (resetuje) błądW przypadku błędu Przejdź do -1Pokaż numer błęduMsgBox Err.NumerPokaż opis błęduMsgBox Err.OpisFunkcja generowania własnego błęduBłąd.Podnieś

Zobacz więcej „Ściągawek” VBA i bezpłatne pliki PDF do pobrania

Obsługa błędów VBA

Obsługa błędów VBA odnosi się do procesu przewidywania, wykrywania i rozwiązywania błędów środowiska wykonawczego VBA. Proces obsługi błędów VBA następuje podczas pisania kodu, zanim wystąpią jakiekolwiek błędy.

Błędy wykonawcze VBA są błędami, które występują podczas wykonywania kodu. Przykłady błędów w czasie wykonywania to:

  • Odwoływanie się do nieistniejącego skoroszytu, arkusza lub innego obiektu
  • Nieprawidłowe dane np. odwoływanie się do komórki Excela zawierającej błąd
  • Próba dzielenia przez zero

Oświadczenie o błędzie w VBA

Większość obsługi błędów VBA odbywa się za pomocą Komunikat o błędzie. Instrukcja On Error informuje VBA, co ma zrobić, jeśli napotka błąd. Znajdują się trzy O oświadczeniach o błędach:

  • W przypadku błędu Przejdź do 0
  • Przy błędzie Wznów Dalej
  • W przypadku błędu Przejdź do Linia

W przypadku błędu Przejdź do 0

W przypadku błędu Przejdź do 0 to domyślne ustawienie VBA. Możesz przywrócić to ustawienie domyślne, dodając następujący wiersz kodu:

1 W przypadku błędu Przejdź do 0

Gdy wystąpi błąd z W przypadku błędu Przejdź do 0, VBA przestanie wykonywać kod i wyświetli standardowe okno komunikatu o błędzie.

Często będziesz dodawać W przypadku błędu Przejdź do 0 po dodaniu Przy błędzie Wznów Dalej obsługa błędów (następna sekcja):

123456789 Błąd podrzędny Przejdź do 0()Przy błędzie Wznów DalejActiveSheet.Shapes("Przycisk_Start").UsuńW przypadku błędu Przejdź do 0„Uruchom więcej kodu”Napis końcowy

Przy błędzie Wznów Dalej

Przy błędzie Wznów Dalej mówi VBA, aby pominął wszystkie wiersze kodu zawierające błędy i przeszedł do następnego wiersza.

1 Przy błędzie Wznów Dalej

Notatka: Przy błędzie Wznów Dalej nie naprawia błędu ani nie rozwiązuje go w inny sposób. Po prostu mówi VBA, aby postępował tak, jakby wiersz kodu zawierający błąd nie istniał. Niewłaściwe użycie Przy błędzie Wznów Dalej może spowodować niezamierzone konsekwencje.

Świetny czas w użyciu Przy błędzie Wznów Dalej jest podczas pracy z obiektami, które mogą, ale nie muszą istnieć. Na przykład chcesz napisać kod, który usunie kształt, ale jeśli uruchomisz kod, gdy kształt jest już usunięty, VBA zgłosi błąd. Zamiast tego możesz użyć Przy błędzie Wznów Dalej aby powiedzieć VBA, aby usunął kształt, jeśli istnieje.

123 Przy błędzie Wznów DalejActiveSheet.Shapes("Przycisk_Start").UsuńW przypadku błędu Przejdź do 0

Zauważ, że dodaliśmy W przypadku błędu Przejdź do 0 po wierszu kodu zawierającym potencjalny błąd. Spowoduje to zresetowanie obsługi błędów.

W następnej sekcji pokażemy, jak sprawdzić, czy wystąpił błąd za pomocą Numer błędu, dając Ci bardziej zaawansowane opcje obsługi błędów…

Err.Number, Err.Clear i wyłapywanie błędów

Zamiast po prostu przeskakiwać wiersz zawierający błąd, możemy go złapać za pomocą Przy błędzie Wznów Dalej oraz Numer błędu.

Numer błędu zwraca numer błędu odpowiadający rodzajowi wykrytego błędu. Jeśli nie ma błędu, Numer błędu = 0.

Na przykład ta procedura zwróci „11”, ponieważ występujący błąd to: Błąd wykonania „11”.

1234567 Numer błędu podrzędnego_ex()Przy błędzie Wznów DalejAktywnaKomórka.Wartość = 2 / 0MsgBox Err.NumerNapis końcowy

Obsługa błędów z Err.Number

Prawdziwa moc Numer błędu polega na możliwości wykrycia, czy wystąpił błąd (Numer błędu 0). W poniższym przykładzie stworzyliśmy funkcję, która sprawdzi, czy arkusz istnieje, używając Err.Number.

12345678910111213141516171819 Podtest WS()MsgBox DoesWSExist("test")Napis końcowyFunkcja DoesWSExist(wsName As String) jako BooleanDim ws As WorksheetPrzy błędzie Wznów DalejUstaw ws = Arkusze(wsName)„Jeśli błąd WS nie istnieje”Jeśli błąd numer 0 WtedyCzy WSistnieje = FałszW przeciwnym razieCzy WSistnieje = PrawdaZakończ, jeśliW przypadku błędu Przejdź do -1Koniec funkcji

Uwaga: dodaliśmy W przypadku błędu Przejdź do -1 do końca, który resetuje Err.Number do 0 (patrz dwie sekcje poniżej).

Z Przy błędzie Wznów Dalej oraz Numer błędu, możesz powielić "Próbuj złapać" funkcjonalność innych języków programowania.

W przypadku błędu Przejdź do Linia

W przypadku błędu Przejdź do Linia mówi VBA, aby "przeszedł do" oznaczonego wiersza kodu, gdy wystąpi błąd. Deklarujesz instrukcję Go To w ten sposób (gdzie errHandler jest etykietą linii, do której należy przejść):

1 W przypadku błędu GoTo errHandler

i utwórz taką etykietę linii:

1 Obsługa błędów:

Uwaga: jest to ta sama etykieta, której używasz ze zwykłą instrukcją VBA GoTo.

Poniżej zademonstrujemy za pomocą W przypadku błędu Przejdź do Linia aby zakończyć procedurę.

W przypadku błędu Wyjdź Sub

Możesz użyć opcji On Error GoTo Line, aby wyjść z podrzędnej, gdy wystąpi błąd.

Możesz to zrobić, umieszczając etykietę linii obsługi błędu na końcu procedury:

12345678 Sub ErrGoToEnd()W przypadku błędu Przejdź do końcaProc„Jakiś kod”proces końcowy:Napis końcowy

lub za pomocą polecenia Exit Sub:

123456789101112131415 Sub ErrGoToEnd()W przypadku błędu Przejdź do końcaProc„Jakiś kod”IdźDo pomińWyjdźproces końcowy:Wyjście SubpomińWyjście:„Nieco więcej kodu”Napis końcowy

Err.Clear, w przypadku błędu GoTo -1 i resetowanie Err.Number

Po obsłużeniu błędu należy go ogólnie wyczyścić, aby zapobiec przyszłym problemom z obsługą błędów.

Po wystąpieniu błędu, Zarówno Błąd.Wyczyść oraz W przypadku błędu Przejdź do -1 może być używany do resetowania Numer błędu do 0. Ale jest jedna bardzo ważna różnica: Błąd.Wyczyść nie resetuje samego błędu, lecz tylko resetuje Numer błędu.

Co to znaczy? Za pomocąBłąd.Wyczyść, nie będzie można zmienić ustawienia obsługi błędów. Aby zobaczyć różnicę, przetestuj ten kod i wymień W przypadku błędu Przejdź do -1 z Błąd.Wyczyść:

123456789101112131415161718192021 Przykłady błędów pomocniczych()W przypadku błędu GoTo errHandler:„Błąd „zdefiniowany w aplikacji”Błąd (13)Wyjście SubObsługa błędów:'Wyczyść błądW przypadku błędu Przejdź do -1W przypadku błędu GoTo errHandler2:Błąd „Niezgodność typów”Błąd (1034)Wyjście SubObsługa błędów2:Debug.Print Błąd.OpisNapis końcowy

Zazwyczaj polecam zawsze używać W przypadku błędu Przejdź do -1, chyba że masz dobry powód do użycia Błąd.Wyczyść zamiast.

VBA w przypadku błędu MsgBox

Możesz również chcieć wyświetlić okno komunikatu w przypadku błędu. Ten przykład wyświetli różne okna komunikatów w zależności od miejsca wystąpienia błędu:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx()Dim errMsg jako ciągW przypadku błędu GoTo errHandler'Scena 1errMsg = "Wystąpił błąd podczas etapu kopiowania i wklejania."„Błąd Podnieś (11)'Etap 2errMsg = "Wystąpił błąd podczas etapu sprawdzania poprawności danych."„Błąd Podnieś (11)„Etap 3”errMsg = "Wystąpił błąd podczas etapu tworzenia rachunku zysków i strat oraz kopiowania."Błędne podniesienie (11)„Etap 4”errMsg = "Wystąpił błąd podczas próby rejestrowania importu na stronie konfiguracji"„Błąd Podnieś (11)Przejdź do końcaProcObsługa błędów:MsgBox errMsgproces końcowy:Napis końcowy

Tutaj możesz zastąpić Err.Raise(11) swoim rzeczywistym kodem.

VBA IsError

Innym sposobem obsługi błędów jest testowanie ich za pomocą funkcji VBA IsError. Funkcja IsError testuje wyrażenie pod kątem błędów, zwracając TRUE lub FALSE, jeśli wystąpi błąd.

123 Sub IsErrorEx()MsgBox IsError(Range("a7").Value)Napis końcowy

Jeśli błąd VBA

Możesz także obsługiwać błędy w VBA za pomocą funkcji Excel IfError. Dostęp do funkcji IfError należy uzyskać za pomocą Arkusz roboczyKlasa funkcji:

1234567 Sub JeśliBłądEx()Dim n As Longn = WorksheetFunction.IfError(Range("a10").Value, 0)MsgBox nNapis końcowy

Spowoduje to wyświetlenie wartości z zakresu A10, jeśli wartość jest błędem, zamiast tego zostanie wyprowadzone 0.

Typy błędów VBA

Błędy uruchomieniowe

Jak stwierdzono powyżej:

Błędy wykonawcze VBA są błędami, które występują podczas wykonywania kodu. Przykłady błędów w czasie wykonywania to:

  • Odwoływanie się do nieistniejącego skoroszytu, arkusza lub innego obiektu
  • Nieprawidłowe dane np. odwoływanie się do komórki Excela zawierającej błąd
  • Próba dzielenia przez zero

Możesz „obsługiwać błędy” błędów w czasie wykonywania, korzystając z metod omówionych powyżej.

Błędy składni

Błędy składni VBA są błędy w pisaniu kodu. Przykłady błędów składniowych obejmują:

  • Błędna pisownia
  • Brakująca lub nieprawidłowa interpunkcja

Edytor VBA identyfikuje wiele błędów składniowych z czerwonym podświetleniem:

Edytor VBA ma również opcję „Automatyczne sprawdzanie składni”:

Gdy ta opcja jest zaznaczona, Edytor VBA wygeneruje okno komunikatu ostrzegające o błędach składni po wprowadzeniu wiersza kodu:

Osobiście uważam to za bardzo denerwujące i wyłączam tę funkcję.

Błędy kompilacji

Przed próbą uruchomienia procedury VBA „skompiluje” procedurę. Kompilacja przekształca program z kodu źródłowego (który możesz zobaczyć) do postaci wykonywalnej (nie możesz jej zobaczyć).

Błędy kompilacji VBA to błędy, które uniemożliwiają kompilację kodu.

Dobrym przykładem błędu kompilacji jest brak deklaracji zmiennej:

Inne przykłady obejmują:

  • Do z pominięciem Następny
  • Wybierz z pominięciem Koniec Wybierz
  • Gdyby z pominięciem Zakończ, jeśli
  • Dzwonię do procedura to nie istnieje

Błędy składni (poprzednia sekcja) są podzbiorem błędów kompilacji.

Debuguj > Kompiluj

Błędy kompilacji pojawią się podczas próby uruchomienia procedury. Ale najlepiej byłoby zidentyfikować błędy kompilacji przed próbą uruchomienia procedury.

Możesz to zrobić, kompilując projekt z wyprzedzeniem. Aby to zrobić, przejdź do Debuguj > Kompiluj projekt VBA.

Kompilator „przejdzie” do pierwszego błędu. Po naprawieniu tego błędu ponownie skompiluj projekt. Powtarzaj, aż wszystkie błędy zostaną naprawione.

Możesz stwierdzić, że wszystkie błędy zostały naprawione, ponieważ Skompiluj projekt VBA będzie wyszarzony:

Błąd przepełnienia

ten Błąd przepełnienia VBA występuje, gdy próbujesz umieścić wartość w zmiennej, która jest zbyt duża. Na przykład, Zmienne całkowite może zawierać tylko wartości z zakresu od -32 768 do 32 768. Jeśli wprowadzisz większą wartość, otrzymasz błąd przepełnienia:

Zamiast tego powinieneś użyć Długa zmienna zapisać większą liczbę.

Inne warunki dotyczące błędów VBA

Błąd przechwytywania VBA

W przeciwieństwie do innych języków programowania, w VBA nie ma Oświadczenie złapania. Możesz jednak zreplikować instrukcję Catch za pomocą Przy błędzie Wznów Dalej oraz Jeśli Err.Number 0 Wtedy. Zostało to omówione powyżej w rozdziale Obsługa błędów z Err.Number.

Błąd ignorowania VBA

Aby zignorować błędy w VBA, po prostu użyj Przy błędzie Wznów Dalej oświadczenie:

1 Przy błędzie Wznów Dalej

Jednak, jak wspomniano powyżej, należy zachować ostrożność podczas korzystania z tej instrukcji, ponieważ nie naprawia ona błędu, po prostu ignoruje wiersz kodu zawierający błąd.

Błąd rzutu VBA / Err.Raise

Aby przejść przez błąd w VBA, użyj Błąd.Podnieś metoda.

Ten wiersz kodu wywoła błąd wykonania „13”: Niezgodność typów:

1 Błędne podniesienie (13)

Zatrzymywanie błędów VBA

Zatrzymywanie błędów VBA to tylko kolejny termin na obsługę błędów VBA.

Komunikat o błędzie VBA

A Komunikat o błędzie VBA wygląda tak:

Po kliknięciu „Debuguj” zobaczysz wiersz kodu, który powoduje błąd:

Obsługa błędów VBA w pętli

Najlepszym sposobem obsługi błędów w pętli jest użycie Przy błędzie Wznów Dalej wraz z Numer błędu aby wykryć, czy wystąpił błąd (Pamiętaj, aby użyć Błąd.Wyczyść aby usunąć błąd po każdym wystąpieniu).

Poniższy przykład podzieli dwie liczby (kolumna A na kolumnę B) i wyśle ​​wynik do kolumny C. Jeśli wystąpi błąd, wynik będzie równy 0.

12345678910111213141516 Test podrzędny()Przyciemnij komórkę jako zakresPrzy błędzie Wznów DalejDla każdej komórki w zakresie("a1:a10")'Ustaw wartość komórkicell.Offset(0, 2).Value = cell.Value / cell.Offset(0,1).Value'Jeżeli Cell.Value to Error, to wartość domyślna to 0Jeśli błąd numer 0 Wtedykomórka.Przesunięcie(0, 2).Wartość = 0Błąd.WyczyśćZakończ, jeśliNastępnyNapis końcowy

Obsługa błędów VBA w programie Access

Wszystkie powyższe przykłady działają dokładnie tak samo w Access VBA, jak w Excel VBA.

123456789101112131415161718 Funkcja DelRecord(frm As Form)'ta funkcja służy do usuwania rekordu w tabeli z formularzaW przypadku błędu Przejdź do zakończeniaZ frmJeśli .Nowy rekord to.CofnijWyjdź z funkcjiZakończ, jeśliKończyć zZ frm.RecordsetClone.Zakładka = frm.Zakładka.Kasowaćfrm.RequeryKończyć zWyjdź z funkcjikończący się:Kończyć sięKoniec funkcji

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave