VBA przy błędzie

Instrukcja Excel VBA w przypadku błędu

Instrukcja VBA On Error jest rodzajem mechanizmu obsługi błędów, który jest używany do kierowania kodem do tego, co zrobi, jeśli napotka jakiś rodzaj błędu, generalnie gdy kod napotka błąd, wykonywanie zatrzymuje się, ale z tą instrukcją w kodzie wykonanie instrukcji Kod jest kontynuowany, ponieważ zawiera zestaw instrukcji do wykonania, gdy napotka błąd.

Przewidywanie błędu w kodzie sprawia, że ​​jesteś profesjonalistą w kodowaniu VBA. Nie możesz uczynić kodu w 100% wydajnym, nawet jeśli masz pewność co do swojego kodu w ten czy inny sposób, może to spowodować błąd.

Identyfikacja i obsługa każdego rodzaju błędu jest prawie niemożliwym zadaniem, ale mamy różne sposoby radzenia sobie z błędami w VBA. Podczas pisania kodu możesz nie przewidzieć, jakiego rodzaju kod błędu może się pojawić, ale jeśli pojawi się jakiś błąd, poświęcisz więcej czasu na debugowanie niż na pisanie samego kodu.

Co to jest błąd?

Błąd to nic innego jak wiersz kodu, którego nie można wykonać z powodu funkcjonalności lub niewłaściwego kodu. Spróbuj więc przewidzieć błąd i sobie z nim poradzić.

Na przykład, jeśli spróbujesz usunąć arkusz, którego tam nie ma, oczywiście nie możemy wykonać tego wiersza kodu.

Istnieją trzy rodzaje błędów: jeden to błąd kompilacji spowodowany niezadeklarowanymi zmiennymi. Drugi to błąd wprowadzania danych spowodowany błędnymi wpisami przez programistę, a trzeci to błąd wykonania spowodowany tym, że VBA nie może rozpoznać linii kodu. Za próbę uzyskania dostępu lub pracy nad arkuszem lub skoroszytem, ​​którego nie ma.

Ale mamy instrukcję w VBA do obsługi wszystkich tego rodzaju błędów, np. Instrukcję „On Error”.

Typy instrukcji On Error

Kluczowym punktem obsługi błędów w VBA jest instrukcja „On Error”. Na przykład w przypadku błędu „wznów następną linię”, „przejdź do innej linii lub przejdź do innej linii” itp.

Instrukcja On Error zawiera trzy rodzaje instrukcji.

  1. GoTo 0  oznacza, że ​​za każdym razem, gdy wystąpi błąd w czasie wykonywania, program Excel lub VBA powinien wyświetlić okno komunikatu o błędzie, informujące o rodzaju napotkanego błędu. Gdy tylko VBA wykona kod, wyłącza wszystkie procedury obsługi błędów w tym konkretnym bloku kodu.
  2. Resume Next oznacza, że ​​za każdym razem, gdy wystąpi błąd, instrukcja ta instruuje program Excel, aby zignorował ten błąd i przeszedł do (wznowienia następnego) następnego wiersza kodu bez wyświetlania żadnych komunikatów o błędach. Nie oznacza to, że naprawi błąd, a po prostu go zignoruje.
  3. GoTo [etykieta] oznacza, że ​​gdy VBA napotka błąd, przejdź do przypisanej etykiety. To sprawia, że ​​kod przeskakuje do określonej linii dostarczonej przez programistę.

Najlepsze 3 sposoby obsługi błędów w VBA

Możesz pobrać ten szablon VBA On Error tutaj - VBA On Error Template

# 1 - Po błędzie Wznów dalej

Załóżmy, że dzielisz wartość 20 przez 0 i zadeklarowałeś zmienną, aby przypisać do niej wynik dzielenia.

Kod:

 Sub OnError_Example1 () Dim i As Integer i = 20/0 End Sub 

Jeśli uruchomisz ten kod, wyświetli się poniższy błąd.

Nie możesz więc podzielić żadnej liczby przez wartość zerową. Numer błędu czasu wykonania to 11, czyli dzielenie przez zero.

Teraz dodam jeszcze jedną linię do kodu.

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer i = 20/0 j = 20/2 End Sub 

Teraz dodam stwierdzenie W przypadku błędu wznów dalej na górze.

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer On Error Resume Next i = 20/0 j = 20/2 End Sub 

Teraz, jeśli wykonam ten kod, nie pokaże mi żadnych komunikatów o błędach, a raczej wykona następny wiersz kodu, tj. J = 20/2.

# 2 - Etykieta błędu GoTo

Zadeklarowałem trzy zmienne.

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer 

Dla wszystkich tych trzech zmiennych przypiszę obliczenia dzielenia.

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer i = 20/0 j = 20/2 k = 10/5

Wynik wszystkich tych trzech obliczeń zostanie wyświetlony w oknie komunikatu.

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer i = 20/0 j = 20/2 k = 10/5 MsgBox "Wartość i to" & i & vbNewLine & "Wartość j to "& j & _ vbNewLine &" Wartość k to "& k & vbNewLine End Sub 

Teraz spróbuję wykonać ten kod, ponieważ obliczenie „I” nie jest poprawne, otrzymamy błąd czasu wykonania 11.

Teraz dodam instrukcję „On Error Resume Next”.

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer On Error Resume Next i = 20/0 j = 20/2 k = 10/5 MsgBox "Wartość i to" & i & vbNewLine & " wartość j to "& j & _ vbNewLine &" Wartość k to "& k & vbNewLine End Sub 

Jeśli to wykonam, pominie on obliczenia „I” i wykona pozostałe dwa obliczenia, a wynik będzie następujący.

Teraz zamiast „Przy błędzie Resume Next” dodam „On Error GoTo KCalculation”

Kod:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer On Error GoTo KCalculation: i = 20/0 j = 20/2 KCalculation: k = 10/5 MsgBox "Wartość i to" & i & vbNewLine & "Wartość j to" & j & _ vbNewLine & "Wartość k to" & k & vbNewLine End Sub 

Uwaga: Tutaj „KCalculation” to nazwa etykiety, którą podałem, możesz podać własną nazwę etykiety bez spacji.

Teraz, jeśli wykonam ten wiersz kodu, nie przeskoczy on do następnego wiersza, a raczej przeskoczy do nazwy etykiety, którą wprowadziłem, tj. „KCalcualtion”. Tutaj zignoruje błąd podany przez „I”, a także nie wykona obliczenia „j”, ale od razu przejdzie do „KCalcualtion”.

# 3 - Wydrukuj numer błędu w VBA

Na końcu kodu możemy również wydrukować numer błędu w osobnym oknie komunikatu. Poniższy wiersz kodu wykona tę pracę.

Kod:

Numer błędu

Teraz uruchomię ten kod w pierwszym oknie komunikatu pokaże wyniki obliczeń.

Kliknij OK, wyświetli się jeszcze jedno okno komunikatu, aby pokazać numer błędu.

W rezultacie idziemy 11, czyli Division by Zero.

We can also get the error description instead of the number. We just need to change the code, below is the code.

Code:

Err.Description

It will show a description like this.

Things to Remember

  • After entering “On Error Resume Next” at the end of code don’t forget to add the statement “On Error GoTo 0”
  • The label name should be the same in both places.
  • Label names need not be defined well in advance.
  • In the end, always see what was the error occurred through the separate message box.