Obsługa błędów Excel VBA - wszystko, co musisz wiedzieć!

Bez względu na to, jak masz doświadczenie w kodowaniu VBA, błędy zawsze będą tego częścią.

Różnica między początkującym a doświadczonym programistą VBA polega na tym, że doświadczeni programiści wiedzą, jak skutecznie obsługiwać i wykorzystywać błędy.

W tym samouczku pokażę Ci różne sposoby skutecznego radzenia sobie z błędami w Excel VBA.

Zanim przejdziemy do obsługi błędów VBA, najpierw zrozummy różne typy błędów, które możesz napotkać podczas programowania w Excel VBA.

Rodzaje błędów VBA w Excelu

W Excel VBA występują cztery rodzaje błędów:

  1. Błędy składni
  2. Błędy kompilacji
  3. Błędy uruchomieniowe
  4. Błędy logiczne

Szybko zrozumiemy, jakie są te błędy i kiedy prawdopodobnie się z nimi spotkasz.

Błąd składni

Błąd składni, jak sama nazwa wskazuje, występuje, gdy VBA znajdzie coś nie tak ze składnią w kodzie.

Na przykład, jeśli zapomnisz części instrukcji/składni, która jest potrzebna, zobaczysz błąd kompilacji.

W poniższym kodzie, jak tylko nacisnę enter po drugiej linii, widzę błąd kompilacji. Dzieje się tak, ponieważ JEŚLI oświadczenie musi mieć „Następniepolecenie, którego brakuje w poniższym kodzie.

Notatka: Kiedy wpisujesz kod w Excel VBA, sprawdza on każde zdanie zaraz po naciśnięciu klawisza Enter. Jeśli VBA stwierdzi, że czegoś brakuje w składni, natychmiast wyświetla komunikat z tekstem, który może pomóc w zrozumieniu brakującej części.

Aby upewnić się, że widzisz błąd składni, gdy czegoś brakuje, musisz upewnić się, że sprawdzanie Autosyntax jest włączone. Aby to zrobić, kliknij „Narzędzia”, a następnie „Opcje”. W oknie dialogowym opcji upewnij się, że opcja „Automatyczne sprawdzanie składni” jest włączona.

Jeśli opcja „Automatyczne sprawdzanie składni” jest wyłączona, VBA nadal podświetli linię z błędem składni na czerwono, ale nie wyświetli okna dialogowego błędu.

Błąd kompilacji

Błędy kompilacji występują, gdy brakuje czegoś, co jest potrzebne do uruchomienia kodu.

Na przykład w poniższym kodzie, gdy tylko spróbuję uruchomić kod, pokaże następujący błąd. Dzieje się tak, ponieważ użyłem instrukcji IF Then bez zamykania jej obowiązkowym „End If”.

Błąd składni jest również rodzajem błędu kompilacji. Błąd składni pojawia się zaraz po naciśnięciu klawisza Enter, a VBA zidentyfikuje, że czegoś brakuje. Błąd kompilacji może również wystąpić, gdy VBA niczego nie znajdzie podczas wpisywania kodu, ale dzieje się tak, gdy kod jest kompilowany lub wykonywany.

VBA sprawdza każdy wiersz podczas wpisywania kodu i podświetla błąd składni, gdy tylko wiersz jest niepoprawny i naciśniesz enter. Z drugiej strony błędy kompilacji są identyfikowane tylko wtedy, gdy cały kod jest analizowany przez VBA.

Poniżej znajduje się kilka scenariuszy, w których napotkasz błąd kompilacji:

  1. Używanie instrukcji IF bez End IF
  2. Używanie instrukcji For z następną
  3. Używanie instrukcji Select bez użycia End Select
  4. Nie deklarowanie zmiennej (działa to tylko wtedy, gdy włączona jest Option Explicit)
  5. Wywołanie pod/funkcji, która nie istnieje (lub z błędnymi parametrami)
Uwaga dotycząca „Opcji Explicit”: Kiedy dodasz „Option Explicit”, będziesz musiał zadeklarować wszystkie zmienne przed uruchomieniem kodu. Jeśli istnieje jakakolwiek zmienna, która nie została zadeklarowana, VBA wyświetli błąd. Jest to dobra praktyka, ponieważ pokazuje błąd w przypadku błędnej pisowni zmiennej. Możesz przeczytać więcej o Option Explicit tutaj.

Błędy w czasie wykonywania

Błędy uruchomieniowe to te, które występują, gdy kod jest uruchomiony.

Błędy czasu wykonywania wystąpią tylko wtedy, gdy wszystkie błędy składni i kompilacji zostaną naprawione.

Na przykład, jeśli uruchomisz kod, który ma otworzyć skoroszyt programu Excel, ale skoroszyt ten jest niedostępny (usunięty lub zmieniona nazwa), kod wyświetli błąd w czasie wykonywania.

Gdy wystąpi błąd w czasie wykonywania, kod zatrzyma kod i wyświetli okno dialogowe błędu.

Nieco bardziej pomocny jest komunikat w oknie dialogowym Błąd w czasie wykonywania. Próbuje wyjaśnić problem, który może pomóc w jego naprawieniu.

Jeśli klikniesz przycisk Debug, podświetli on część kodu, która prowadzi do błędu.

Jeśli poprawiłeś błąd, możesz kliknąć przycisk Uruchom na pasku narzędzi (lub nacisnąć F5), aby kontynuować uruchamianie kodu od miejsca, w którym został.

Możesz też kliknąć przycisk Zakończ, aby wyjść z kodu.

Ważny: Jeśli klikniesz przycisk Zakończ w oknie dialogowym, zatrzyma kod w napotkanym wierszu. Jednak wszystkie poprzednie wiersze kodu zostałyby wykonane.

Błędy logiczne

Błędy logiczne nie spowodują zatrzymania kodu, ale mogą prowadzić do błędnych wyników. Mogą to być również najtrudniejsze typy błędów do rozwiązania.

Te błędy nie są podkreślane przez kompilator i należy je naprawić ręcznie.

Jednym z przykładów błędu logicznego (z którym często się utknąłem) jest wpadanie w niekończącą się pętlę.

Innym przykładem może być sytuacja, gdy daje wynik, który jest błędny. Na przykład możesz użyć niewłaściwej zmiennej w kodzie lub dodać dwie zmienne, w których jedna jest niepoprawna.

Jest kilka sposobów, których używam do radzenia sobie z błędami logicznymi:

  1. Wstaw Message Box w dowolnym miejscu kodu i podświetl wartości/dane, które pomogą zrozumieć, czy wszystko idzie zgodnie z oczekiwaniami.
  2. Zamiast uruchamiać kod za jednym razem, przejdź przez każdą linię jeden po drugim. Aby to zrobić, kliknij w dowolnym miejscu kodu i naciśnij F8. zauważysz, że za każdym razem, gdy naciśniesz F8, wykonywana jest jedna linia. Pozwala to przejść przez kod jeden wiersz na raz i zidentyfikować błędy logiczne.

Używanie debugowania do znajdowania błędów kompilacji/składni

Gdy skończysz z kodem, dobrą praktyką jest skompilowanie go przed uruchomieniem.

Aby skompilować kod, kliknij opcję Debug na pasku narzędzi i kliknij opcję Kompiluj VBAProject.

Kiedy kompilujesz projekt VBA, przechodzi on przez kod i identyfikuje błędy (jeśli występują).

Jeśli znajdzie błąd, wyświetli okno dialogowe z błędem. Znajduje błędy jeden po drugim. Więc jeśli znajdzie błąd i go poprawiłeś, musisz ponownie uruchomić kompilację, aby znaleźć inne błędy (jeśli są).

Gdy Twój kod jest wolny od błędów, opcja Kompiluj VBAProject będzie wyszarzona.

Pamiętaj, że kompilacja znajdzie tylko błędy „Składni” i „Kompiluj”. NIE znajdzie błędów czasu wykonywania.

Kiedy piszesz kod VBA, nie chcesz, aby pojawiały się błędy. Aby tego uniknąć, istnieje wiele metod obsługi błędów, których możesz użyć.

W kilku następnych sekcjach tego artykułu omówię metody, których można użyć do obsługi błędów VBA w programie Excel.

Skonfiguruj ustawienia błędów (obsługiwane i nieobsługiwane błędy)

Zanim zaczniesz pracować z kodem, musisz sprawdzić jedno ustawienie w Excel VBA.

Przejdź do paska narzędzi VBA i kliknij Narzędzia, a następnie kliknij Opcje.

W oknie dialogowym Opcje kliknij kartę Ogólne i upewnij się, że w grupie „Wyłapywanie błędów” zaznaczona jest opcja „Przerwij przy nieobsługiwanych błędach”.

Pozwólcie, że wyjaśnię trzy opcje:

  1. Przerwij wszystkie błędy: Spowoduje to zatrzymanie kodu na wszystkich typach błędów, nawet jeśli użyłeś technik do obsługi tych błędów.
  2. Przerwa w module zajęć: Spowoduje to zatrzymanie kodu we wszystkich nieobsłużonych błędach, a jednocześnie, jeśli używasz obiektów takich jak Userforms, również przerwie się w tych obiektach i podświetli dokładną linię, która spowodowała błąd.
  3. Przerwa w przypadku nieobsługiwanych błędów: Spowoduje to zatrzymanie kodu tylko dla tych błędów, które nie są obsługiwane. Jest to ustawienie domyślne, ponieważ zapewnia powiadomienie o wszelkich nieobsłużonych błędach. Jeśli używasz obiektów, takich jak Userforms, nie podświetli to linii powodującej błąd w obiekcie, ale podświetli tylko linię, która odnosi się do tego obiektu.
Notatka: Jeśli pracujesz z obiektami, takimi jak formularze użytkownika, możesz zmienić to ustawienie na „Przerwij moduły klasy”. Różnica między #2 i #3 polega na tym, że użycie modułu Break in Class spowoduje przejście do określonej linii w obiekcie, który powoduje błąd. Możesz także wybrać opcję „Przerwij przy nieobsługiwanych błędach”.

Krótko mówiąc – jeśli dopiero zaczynasz pracę z Excel VBA, upewnij się, że zaznaczona jest opcja „Przerwij przy nieobsługiwanych błędach”.

Obsługa błędów VBA za pomocą instrukcji „On Error”

Gdy Twój kod napotka błąd, możesz zrobić kilka rzeczy:

  1. Zignoruj ​​błąd i pozwól kodowi kontynuować
  2. Przygotuj kod obsługi błędów i uruchom go, gdy wystąpi błąd

Obie te metody obsługi błędów zapewniają, że użytkownik końcowy nie zobaczy błędu.

Istnieje kilka stwierdzeń „Przy błędzie”, których możesz użyć, aby to zrobić.

Przy błędzie Wznów Dalej

Jeśli użyjesz w kodzie opcji „Po błędzie wznowienia dalej”, każdy napotkany błąd zostanie zignorowany, a kod będzie nadal działał.

Ta metoda obsługi błędów jest używana dość często, ale należy zachować ostrożność podczas jej używania. Ponieważ całkowicie ignoruje każdy błąd, który może wystąpić, możesz nie być w stanie zidentyfikować błędów, które należy poprawić.

Na przykład, jeśli poniższy kod zostanie uruchomiony, zwróci błąd.

Sub AssignValues() x = 20 / 4 y = 30 / 0 End Sub

Dzieje się tak, ponieważ nie można podzielić liczby przez zero.

Ale jeśli użyję instrukcji „On Error Resume Next” w tym kodzie (jak pokazano poniżej), zignoruje błąd i nie będę wiedział, że jest problem, który należy naprawić.

Sub AssignValues() W przypadku błędu Wznów Dalej x = 20 / 4 y = 30 / 0 Koniec Sub

On Error Resume Next powinien być używany tylko wtedy, gdy wyraźnie wiesz, jakie błędy ma wyrzucić twój kod VBA i możesz go zignorować.

Na przykład poniżej znajduje się kod zdarzenia VBA, który natychmiast doda wartość daty i godziny w komórce A1 nowo wstawionego arkusza (ten kod jest dodawany w arkuszu, a nie w module).

Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Format(Teraz, "dd-mmm-rrrr hh:mm:ss") End Sub

Chociaż w większości przypadków działa to świetnie, pokaże błąd, jeśli dodam arkusz wykresu zamiast arkusza roboczego. Ponieważ arkusz wykresu nie zawiera komórek, kod wygeneruje błąd.

Tak więc, jeśli użyję instrukcji „On Error Resume Next” w tym kodzie, będzie ona działać zgodnie z oczekiwaniami z arkuszami roboczymi i nic nie zrobi z arkuszami wykresów.

Private Sub Workbook_NewSheet(ByVal Sh As Object) W przypadku błędu Wznów Dalej Sh.Range("A1") = Format(Teraz, "dd-mmm-rrrr hh:mm:ss") End Sub

Uwaga: Instrukcja On Error Resume Next najlepiej jest stosować, gdy wiesz, jakie błędy możesz napotkać. A jeśli uważasz, że zignorowanie tych błędów jest bezpieczne, możesz z niego skorzystać.

Możesz przenieść ten kod na wyższy poziom, analizując, czy wystąpił błąd i wyświetlając odpowiedni komunikat.

Poniższy kod wyświetli okno komunikatu informujące użytkownika, że ​​arkusz nie został wstawiony.

Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Teraz "dd-mmm-rrrr hh:mm:ss") Jeśli Err.Number 0 Następnie MsgBox "Wygląda jak ty wstawiono arkusz wykresu" & vbCrLf & "Błąd - " & Err.Opis End If End Sub

„Err.Number” służy do uzyskania numeru błędu, a „Err.Description” służy do uzyskania opisu błędu. Zostaną one omówione w dalszej części tego samouczka.

W przypadku błędu Przejdź do 0

„On Error GoTo 0” zatrzyma kod w wierszu, który powoduje błąd i wyświetli okno komunikatu opisujące błąd.

Mówiąc prościej, włącza domyślne zachowanie sprawdzania błędów i wyświetla domyślny komunikat o błędzie.

Więc po co w ogóle go używać?

Zwykle nie trzeba używać „Po błędzie przejdź do 0”, ale może być przydatne, gdy używasz go w połączeniu z „Po błędzie wznowienia dalej”

Pozwól mi wyjaśnić!

Poniższy kod zaznaczy wszystkie puste komórki w zaznaczeniu.

Sub SelectFormulaCells() Selection.SpecialCells(xlCellTypeBlanks).Wybierz End Sub

Ale wyświetliłby błąd, gdy w wybranych komórkach nie ma pustych komórek.

Aby uniknąć wyświetlania błędu, możesz użyć opcji On Error Resume next”

Teraz wyświetli również każdy błąd po uruchomieniu poniższego kodu:

Sub SelectFormulaCells() Po błędzie Wznów Następny Selection.SpecialCells(xlCellTypeBlanks).Select End Sub

Na razie w porządku!

Problem pojawia się, gdy istnieje część kodu, w której może wystąpić błąd, a ponieważ używasz „On Error Resume Next”, kod po prostu go zignoruje i przejdzie do następnej linii.

Na przykład w poniższym kodzie nie będzie monitu o błąd:

Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select „… więcej kodu, który może zawierać błąd End Sub

W powyższym kodzie są dwa miejsca, w których może wystąpić błąd. Pierwsze miejsce to miejsce, w którym wybieramy wszystkie puste komórki (za pomocą Selection.SpecialCells), a drugie w pozostałym kodzie.

Podczas gdy pierwszy błąd jest oczekiwany, żaden następny błąd już nie.

Tu z pomocą przychodzi On Error Goto 0.

Kiedy go używasz, resetujesz ustawienie błędu do wartości domyślnej, gdzie zacznie wyświetlać błędy, gdy go napotka.

Na przykład w poniższym kodzie nie będzie błędu w przypadku braku pustych komórek, ale pojawi się monit o błąd z powodu „10/0”

Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select On Error GoTo 0 '… więcej kodu, który może zawierać błąd End Sub

W przypadku błędu Przejdź do [Etykieta]

Powyższe dwie metody – „Po błędzie wznowienia dalej” i „Po błędzie przejdź do 0” – nie pozwalają nam naprawdę poradzić sobie z błędem. Jeden sprawia, że ​​kod zignoruje błąd, a drugi wznawia sprawdzanie błędów.

On Error Go [Etykieta] to sposób, w jaki możesz określić, co chcesz zrobić w przypadku błędu w kodzie.

Poniżej znajduje się struktura kodu, która używa tego programu obsługi błędów:

Sub Test() On Error GoTo Label: X = 10 / 0 'ta linia powoduje błąd '… .Twój pozostały kod przechodzi tutaj Exit Sub Label: ' kod obsługujący błąd End Sub

Zwróć uwagę, że przed błędem obsługi „Etykiety” znajduje się wyjście podrzędne. Zapewnia to, że w przypadku braku błędów subskrypcja zostanie zakończona, a kod „Label” nie zostanie wykonany. Jeśli nie użyjesz Exit Sub, zawsze wykona kod „Label”.

W poniższym przykładowym kodzie, gdy wystąpi błąd, kod przeskakuje i wykonuje kod w sekcji obsługi (i wyświetla okno komunikatu).

Sub Errorhandler() W przypadku błędu GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Wygląda na to, że wystąpił błąd" & vbCrLf & Err.Description End Sub

Zwróć uwagę, że gdy wystąpi błąd, kod został już uruchomiony i wykonał wiersze przed wierszem powodującym błąd. W powyższym przykładzie kod ustawia wartość X na 12, ale ponieważ błąd występuje w następnym wierszu, nie ustawia wartości dla Y i Z.

Gdy kod przeskoczy do kodu obsługi błędu (ErrMsg w tym przykładzie), będzie kontynuował wykonywanie wszystkich wierszy w i poniżej kodu obsługi błędu i wyjście z podrzędnej.

W przypadku błędu Przejdź do -1

Ten jest nieco skomplikowany i w większości przypadków jest mało prawdopodobne, aby go użyć.

Ale nadal to omówię, ponieważ spotkałem się z sytuacją, w której było to potrzebne (możesz zignorować i przejść do następnej sekcji, jeśli szukasz tylko podstaw).

Zanim przejdę do jego mechaniki, spróbuję wyjaśnić, gdzie może się przydać.

Załóżmy, że masz kod, w którym wystąpił błąd. Ale wszystko jest dobrze, ponieważ masz jeden program obsługi błędów. Ale co się stanie, gdy pojawi się kolejny błąd w kodzie obsługi błędów (tak… trochę jak w filmie inauguracyjnym).

W takim przypadku nie można użyć drugiego modułu obsługi, ponieważ pierwszy błąd nie został usunięty. Więc chociaż poradziłeś sobie z pierwszym błędem, w pamięci VBA nadal istnieje. A w pamięci VBA jest miejsce tylko na jeden błąd - nie dwa lub więcej.

W tym scenariuszu można użyć opcji On Error Goto -1.

Usuwa błąd i zwalnia pamięć VBA do obsługi następnego błędu.

Dość gadania!

Wyjaśnię teraz na przykładach.

Załóżmy, że mam poniższy kod. Spowoduje to błąd, ponieważ istnieje dzielenie przez zero.

Sub Errorhandler() X = 12 Y = 20 / 0 Z = 30 Koniec Sub

Aby to obsłużyć, używam kodu obsługi błędów (o nazwie ErrMsg), jak pokazano poniżej:

Sub Errorhandler() W przypadku błędu GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Wygląda na to, że wystąpił błąd" & vbCrLf & Err.Description End Sub

Teraz znowu wszystko jest w porządku. Gdy tylko wystąpi błąd, używany jest program obsługi błędów i wyświetla okno komunikatu, jak pokazano poniżej.

Teraz rozszerzam kod, aby mieć więcej kodu w module obsługi błędów lub po nim.

Sub Errorhandler() W przypadku błędu GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Wygląda na to, że wystąpił błąd" & vbCrLf & Err.Description A = 10 / 2 B = 35 / 0 End Sub

Ponieważ pierwszy błąd został obsłużony, a drugi nie, ponownie widzę błąd, jak pokazano poniżej.

Wciąż wszystko dobrze. Kod zachowuje się tak, jak się tego spodziewaliśmy.

Aby obsłużyć drugi błąd, używam innego programu obsługi błędów (ErrMsg2).

Sub Errorhandler() W przypadku błędu GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Wyjdź Sub ErrMsg: MsgBox „Wygląda na to, że wystąpił błąd” & vbCrLf & Err.Description W przypadku błędu GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Wygląda na to, że ponownie wystąpił błąd" & vbCrLf & Err.Description End Sub

I tutaj to jest nie działa zgodnie z oczekiwaniami.

Jeśli uruchomisz powyższy kod, nadal będzie dawać błąd w czasie wykonywania, nawet po umieszczeniu drugiej procedury obsługi błędów.

Dzieje się tak, ponieważ nie usunęliśmy pierwszego błędu z pamięci VBA.

Tak, poradziliśmy sobie z tym! Ale nadal pozostaje w pamięci.

A kiedy VBA napotka inny błąd, nadal utknął z pierwszym błędem, a zatem drugi program obsługi błędów nie jest używany. Kod zatrzymuje się w wierszu, który spowodował błąd i wyświetla monit o błędzie.

Aby wyczyścić pamięć VBA i usunąć poprzedni błąd, musisz użyć „On Error Goto -1”.

Więc jeśli dodasz ten wiersz w poniższym kodzie i uruchomisz go, będzie działać zgodnie z oczekiwaniami.

Sub Errorhandler() W przypadku błędu GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Wyjście Sub ErrMsg: MsgBox „Wydaje się, że wystąpił błąd” & vbCrLf & Err.Description W przypadku błędu GoTo -1 W przypadku błędu GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Ponownie wystąpił błąd" & vbCrLf & Err.Description End Sub
Notatka: Błąd jest automatycznie usuwany po zakończeniu podprogramu.Tak więc „On Error Goto -1” może być przydatne, gdy otrzymujesz dwa lub więcej niż dwa błędy w tym samym podprogramie.

Błąd obiektu

Za każdym razem, gdy wystąpi błąd w kodzie, do uzyskania szczegółowych informacji o błędzie (takich jak numer błędu lub opis) używany jest obiekt Err.

Błędne właściwości obiektu

Obiekt Err ma następujące właściwości:

Nieruchomość Opis
Numer Liczba reprezentująca rodzaj błędu. Gdy nie ma błędu, ta wartość wynosi 0
Opis Krótki opis błędu
Źródło Nazwa projektu, w którym wystąpił błąd
Kontekst pomocy Identyfikator kontekstu pomocy dla błędu w pliku pomocy
Plik pomocy Ciąg reprezentujący lokalizację folderu i nazwę pliku pomocy

Chociaż w większości przypadków nie musisz używać obiektu Err, czasami może to być przydatne podczas obsługi błędów w programie Excel.

Załóżmy na przykład, że masz zestaw danych, jak pokazano poniżej, i dla każdej liczby w zaznaczeniu chcesz obliczyć pierwiastek kwadratowy w sąsiedniej komórce.

Poniższy kod może to zrobić, ale ponieważ w komórce A5 znajduje się ciąg tekstowy, pojawia się błąd, gdy tylko to nastąpi.

Sub FindSqrRoot() Dim rng As Range Set rng = Zaznaczenie dla każdej komórki In rng cell.Offset(0, 1)).Value = Sqr(cell.Value) Następna komórka End Sub

Problem z tego typu komunikatem o błędzie polega na tym, że nie informuje on, co poszło nie tak i gdzie wystąpił problem.

Możesz użyć obiektu Err, aby te komunikaty o błędach były bardziej zrozumiałe.

Na przykład, jeśli teraz użyję poniższego kodu VBA, zatrzyma on kod, gdy tylko wystąpi błąd i wyświetli okno komunikatu z adresem komórki, w której występuje problem.

Sub FindSqrRoot() Dim rng As Range Set rng = Zaznaczenie dla każdej komórki In rng W przypadku błędu GoTo ErrHandler cell.Offset(0, 1)).Value = Sqr(cell.Value) Następna komórka ErrHandler: MsgBox "Numer błędu:" i błąd .Number & vbCrLf & _ "Opis błędu: " & Błąd.Opis & vbCrLf & _ "Błąd w: " & komórka.Adres Koniec Sub

Powyższy kod da ci znacznie więcej informacji niż prosty „Niezgodność typu”, zwłaszcza adres komórki, abyś wiedział, gdzie wystąpił błąd.

Możesz dalej doprecyzować ten kod, aby upewnić się, że kod działa do końca (zamiast łamać przy każdym błędzie), a następnie podaje listę adresów komórek, w których wystąpił błąd.

Poniższy kod zrobi to:

Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Błąd Wznów Dalej Ustaw rng = Wybór dla każdej komórki In rng cell.Offset(0, 1)).Value = Sqr(cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Błąd w następujących komórkach" & ErrorCells Exit Sub End Sub

Powyższy kod działa do końca i daje pierwiastek kwadratowy ze wszystkich komórek, które mają w sobie liczby (w sąsiedniej kolumnie). Następnie wyświetla komunikat z listą wszystkich komórek, w których wystąpił błąd (jak pokazano poniżej):

Metody obiektu błędu

Chociaż właściwości Err są przydatne do pokazywania przydatnych informacji o błędach, istnieją również dwie metody Err, które mogą pomóc w obsłudze błędów.

metoda Opis
Jasne Czyści wszystkie ustawienia właściwości obiektu Err
Wznosić Generuje błąd w czasie wykonywania

Nauczmy się szybko, co to jest i jak/dlaczego używać ich z VBA w Excelu.

Metoda wyczyszczenia błędu

Załóżmy, że masz zestaw danych, jak pokazano poniżej i chcesz uzyskać pierwiastek kwadratowy ze wszystkich tych liczb w sąsiedniej kolumnie.

Poniższy kod pobierze pierwiastki kwadratowe wszystkich liczb w sąsiedniej kolumnie i wyświetli komunikat, że wystąpił błąd w komórce A5 i A9 (ponieważ zawierają one tekst).

Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Błąd Wznów Dalej Ustaw rng = Wybór dla każdej komórki In rng cell.Offset(0, 1)).Value = Sqr(cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Błąd w następujących komórkach" & ErrorCells End Sub

Zauważ, że użyłem metody Err.Clear w instrukcji If Then.

Po wystąpieniu błędu i przechwyceniu przez warunek If metoda Err.Clear resetuje numer błędu z powrotem do 0. Zapewnia to, że warunek IF przechwytuje tylko błędy dla komórek, w których został zgłoszony.

Gdybym nie użył metody Err.Clear, po wystąpieniu błędu, zawsze będzie to prawda w warunku JEŻELI, a numer błędu nie zostałby zresetowany.

Innym sposobem, aby to zadziałało, jest użycie On Error Goto -1, który całkowicie resetuje błąd.

Notatka: Err.Clear różni się od On Error Goto -1. Err.Clear usuwa tylko opis błędu i numer błędu. nie resetuje go całkowicie. Oznacza to, że jeśli w tym samym kodzie wystąpi kolejny błąd, nie będziesz w stanie go obsłużyć przed zresetowaniem (co można zrobić za pomocą „On Error Goto -1”, a nie „Err.Clear”).

Metoda podniesienia błędu

Metoda Err.Raise umożliwia zgłoszenie błędu w czasie wykonywania.

Poniżej znajduje się składnia użycia metody Err.Raise:

Err.Raise [liczba], [źródło], [opis], [plik pomocy], [kontekst pomocy]

Wszystkie te argumenty są opcjonalne i możesz ich użyć, aby komunikat o błędzie był bardziej znaczący.

Ale dlaczego miałbyś kiedykolwiek sam zgłaszać błąd?

Dobre pytanie!

Możesz użyć tej metody, gdy wystąpi błąd (co oznacza, że ​​i tak wystąpi błąd), a następnie użyj tej metody, aby powiedzieć użytkownikowi więcej o błędzie (zamiast mniej przydatnego komunikatu o błędzie, który pokazuje VBA domyślnie).

Załóżmy na przykład, że masz zestaw danych, jak pokazano poniżej, i chcesz, aby wszystkie komórki miały tylko wartości liczbowe.

Sub RaiseError() Dim rng As Range Set rng = Zaznaczenie po błędzie GoTo ErrHandler dla każdej komórki w rng If Not (IsNumeric(Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html" End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Powyższy kod wyświetli komunikat o błędzie, który ma określony opis i plik kontekstu.

Osobiście nigdy nie używałem Err.Raise, ponieważ pracuję głównie z Excelem. Ale dla kogoś, kto używa VBA do pracy z Excelem wraz z innymi aplikacjami, takimi jak Outlook, Word lub PowerPoint, może to być przydatne.

Oto szczegółowy artykuł na temat metody Err.Raise, jeśli chcesz dowiedzieć się więcej.

Najlepsze praktyki obsługi błędów VBA

Bez względu na to, jak biegle zdobędziesz pisanie kodu VBA, błędy zawsze będą jego częścią. Najlepsi programiści to ci, którzy potrafią właściwie poradzić sobie z tymi błędami.

Oto kilka najlepszych praktyk, których możesz użyć, jeśli chodzi o obsługę błędów w Excel VBA.

  1. Użyj „On Error Go [Label]” na początku kodu. Zapewni to obsługę wszelkich błędów, które mogą się stamtąd wydarzyć.
  2. Użyj opcji „Po błędzie wznowienia dalej” TYLKO wtedy, gdy masz pewność, jakie błędy mogą wystąpić. Używaj go tylko z oczekiwanym błędem. Jeśli użyjesz go z nieoczekiwanymi błędami, po prostu go zignoruje i przejdzie do przodu. Możesz użyć „On Error Resume Next” z „Err.Raise”, jeśli chcesz zignorować określony typ błędu i złapać resztę.
  3. Korzystając z programów obsługi błędów, upewnij się, że używasz Exit Sub przed modułami obsługi. Zapewni to, że kod obsługi błędów zostanie wykonany tylko wtedy, gdy wystąpi błąd (w przeciwnym razie zawsze będzie wykonywany).
  4. Użyj wielu programów obsługi błędów, aby wyłapać różne rodzaje błędów. Posiadanie wielu programów obsługi błędów zapewnia prawidłowe rozwiązanie błędu. Na przykład, chciałbyś obsłużyć błąd „niezgodności typu” inaczej niż błąd czasu wykonywania „Podział przez 0”.

Mam nadzieję, że ten artykuł Excela okazał się przydatny!

Oto kilka samouczków Excel VBA, które mogą Ci się spodobać:

  • Typy danych Excel VBA - kompletny przewodnik
  • Pętle Excel VBA - do następnego, do póki, do, do każdego
  • Wydarzenia Excel VBA - łatwy (i kompletny) przewodnik
  • Edytor Excel Visual Basic - jak go otworzyć i używać w programie Excel

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

wave wave wave wave wave