VBA o izjavah o napakah | Najboljši trije načini za obravnavo napak

Izjava Excel VBA o napaki

Stavek VBA On Error je vrsta mehanizma za obdelavo napak, ki se uporablja za vodenje kode, kaj storiti, če naleti na katero koli vrsto napake, običajno kadar koda naleti na napako, se izvajanje ustavi, vendar s tem stavkom v kodi izvedba koda se nadaljuje, saj ima nabor navodil, ko naleti na napako.

Če predvidevate napako v kodi, ste profesionalni v kodiranju VBA. Kode ne morete narediti 100-odstotno učinkovito, tudi če ste prepričani o svoji kodi na tak ali drugačen način, da lahko povzroči napako.

Skoraj nemogoča naloga je prepoznati in obravnavati vse vrste napak, vendar imamo v VBA različne načine za obvladovanje napak. Med pisanjem kode morda ne pričakujete, da se bo vrsta kode napake vrnila, če pa pride do napake, boste porabili več časa za razhroščevanje kot samo pisanje kode.

Kaj je napaka?

Napaka ni nič drugega kot vrstice kode ni mogoče izvesti zaradi funkcionalnosti ali napačne kode. Poskusite torej predvideti napako in jo odpraviti.

Če na primer poskusite izbrisati list, ki ga ni, očitno ne moremo izvršiti te vrstice kode.

Napaka je treh vrst, napaka prevedena je zaradi neprijavljenih spremenljivk. Druga je napaka pri vnosu podatkov zaradi napačnih vnosov kodirnika, tretja pa napaka pri času izvajanja, ker VBA ne more prepoznati vrstice kode. Za poskus dostopa do delovnega lista ali delovnega zvezka, ki ga ni, ali dela na njem.

V VBA pa imamo izjavo, ki obravnava vse te vrste napak, tj. Izjavo "O napaki".

Vrste izjav o napakah

Ključna točka obravnave napak v VBA je stavek "On Error". Na primer o napaki »nadaljuj naslednjo vrstico«, »pojdi na drugo vrstico ali jo preskoči« itd.

Izjava o napaki vsebuje tri vrste stavkov.

  1. GoTo 0  pomeni, da vsakič, ko pride do napake med izvajanjem, excel ali pa mora VBA prikazati polje s sporočilom o napaki, v katerem piše, da je prišlo do napake. Takoj ko VBA izvede kodo, onemogoči vse obdelovalce napak v določenem bloku kode.
  2. Nadaljuj naprej pomeni, da vsakič, ko pride do napake, ta stavek naroči excelu, naj to napako ignorira in nadaljuje (nadaljuje z naslednjo) naslednjo vrstico kode, ne da bi prikazal sporočila o napakah. To ne pomeni, da bo napako odpravil, temveč jo samo prezre.
  3. GoTo [label] pomeni, da kadar koli VBA naleti na napako, pojdite na dodeljeno oznako. Zaradi tega koda preskoči na določeno vrstico, ki jo nudi kodirnik.

Najboljši trije načini za obravnavo napak v VBA

To predlogo VBA On Error lahko prenesete tukaj - VBA On Error Template

# 1 - Ob napaki Nadaljuj naprej

Predpostavimo, da vrednost 20 delite z 0 in ste spremenljivko razglasili, da ji dodelite rezultat delitve.

Koda:

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

Če zaženete to kodo, se prikaže spodnja napaka.

Torej nobene številke ne morete razdeliti na nič. Številka napake med izvajanjem je 11, tj. Delitev z ničlo.

Zdaj bom kodi dodal še eno vrstico.

Koda:

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

Zdaj bom na vrhu dodal izjavo o nadaljevanju napake.

Koda:

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

Zdaj, če izvedem to kodo, mi ne bo več izpisala sporočil o napakah, temveč bo izvedla naslednjo vrstico kode, tj.

# 2 - Napaka GoTo Label

Deklariral sem tri spremenljivke.

Koda:

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

Za vse te tri spremenljivke bom dodelil izračun delitve.

Koda:

 Sub OnError_Example1 () Dim i Kot celo število, j Kot celo število, k Kot celo število i = 20/0 j = 20/2 k = 10/5

Rezultat vseh teh treh izračunov bo prikazan v polju za sporočila.

Koda:

 Sub OnError_Example1 () Dim i Kot celo število, j Kot celo število, k Kot celo število i = 20/0 j = 20/2 k = 10/5 MsgBox "Vrednost i je" & i & vbNewLine & "Vrednost j je "& j & _ vbNewLine &" Vrednost k je "& k & vbNewLine End Sub 

Zdaj bom poskusil izvršiti to kodo, ker izračun "I" ni pravilen, dobili bomo napako med izvajanjem 11.

Zdaj bom dodal izjavo "Ob nadaljevanju napake naprej".

Koda:

 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 "The value of i is " & i & vbNewLine & "The value of j is " & j & _ vbNewLine & "The value of k is " & k & vbNewLine End Sub 

If I execute this it will skip “I” calculation and execute the remaining two calculations and the result is as follows.

Now instead of “On Error Resume Next” I will add “On Error GoTo KCalculation”

Code:

 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 "The value of i is " & i & vbNewLine & "The value of j is " & j & _ vbNewLine & "The value of k is " & k & vbNewLine End Sub 

Note: Here “KCalculation” is the label name I had given, you can give your own label name without any space.

Now if I execute this line of code it will not jump to the next line rather it will jump to the label name I have entered i.e. “KCalcualtion”. Here it will ignore the error given by “I” and also it will not execute “j” calculation but straight away it jumps to “KCalcualtion”.

#3 – Print Error Number in VBA

At the end of the code, we can also print the error number in a separate message box. The following line of code will do this job.

Code:

Err.Number

Now I will run this code first message box will show the calculation results.

Click on OK, it will show one more message box to show the error number.

We go 11 as the result i.e. 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.