VBA On Error

Excel VBA om felmeddelande

VBA On Error- uttalande är en typ av felhanteringsmekanism som används för att vägleda koden att göra vad om den stöter på någon typ av fel, vanligtvis när en kod stöter på ett fel slutar exekveringen men med detta uttalande i koden körningen av koden fortsätter som den har instruktioner att göra när det stöter på ett fel.

Att förutse felet i koden gör dig till ett proffs i VBA-kodning. Du kan inte göra koden 100% effektiv, även om du är säker på din kod på ett eller annat sätt kan det orsaka ett fel.

Det är nästan en omöjlig uppgift att identifiera och hantera alla typer av fel, men vi har olika sätt att hantera ett fel i VBA. När du skriver koden kanske du inte förväntar dig vilken typ av felkod som kan kasta upp men om något fel kommer kommer du att spendera mer tid på felsökning än att skriva själva koden.

Vad är ett fel?

Ett fel är inget annat än en kodrad kan inte köras på grund av funktionaliteten eller fel kod. Så försök att förutse felet och hantera det.

Om du till exempel försöker ta bort arket som inte finns kan vi självklart inte köra den kodraden.

Ett fel är av tre typer en kompileras fel på grund av odeklarerade variabler. Det andra är datainmatningsfel på grund av fel inmatningar av kodaren, och det tredje är körtidsfel på grund av att VBA inte kan känna igen kodraden. För att försöka komma åt eller arbeta på kalkylblad eller arbetsbok som inte finns.

Men vi har ett uttalande i VBA för att hantera alla dessa typer av fel, dvs. "On Error" -uttalande.

Typer av felmeddelanden

Nyckelpunkten för hanteringsfel i VBA är uttalandet "On Error". Till exempel vid fel “återuppta nästa rad”, “gå till eller hoppa till en annan rad”, etc ...

On Error-uttalande har tre typer av uttalanden.

  1. GoTo 0 betyder när körtidsfelet  uppträder excel eller VBA ska visa felmeddelandefältet som säger vilken typ av fel det har stött på. Så snart VBA kör koden inaktiverar det alla felhanterare i det specifika blocket på koden.
  2. Resume Next betyder närhelst felet inträffar detta uttalande instruerar excel att ignorera det felet och gå vidare till (återuppta nästa) nästa kodrad utan att visa några felmeddelanden. Det betyder inte att det kommer att fixa felet utan det ignorerar bara felet.
  3. GoTo [label] betyder när VBA stöter på ett fel, gå till den tilldelade etiketten. Detta gör att koden hoppar till den specifika rad som tillhandahålls av kodaren.

Topp 3 sätt att hantera fel i VBA

Du kan ladda ner denna VBA On Error-mall här - VBA On Error Template

# 1 - Vid fel Återuppta nästa

Antag att du delar värdet 20 med 0 och att du har deklarerat variabeln för att tilldela resultatet av divisionen till den.

Koda:

 Sub OnError_Example1 () Dim i som heltal i = 20/0 End Sub 

Om du kör den här koden kommer det att kasta nedanstående fel.

Så du kan inte dela något tal med nollvärde. Körtid felnummer är 11 dvs Division by Zero.

Nu lägger jag till ytterligare en rad i koden.

Koda:

 Sub OnError_Example1 () Dim i som heltal, j som heltal i = 20/0 j = 20/2 slut sub 

Nu ska jag lägga till uttalandet On error CV nästa längst upp.

Koda:

 Sub OnError_Example1 () Dim i As Integer, j As Integer On Error Fortsätt Nästa i = 20/0 j = 20/2 End Sub 

Om jag nu kör den här koden kommer det inte att ge mig några felmeddelanden snarare kommer den att köra nästa kodrad dvs j = 20/2.

# 2 - Vid fel GoTo-etikett

Jag har förklarat tre variabler.

Koda:

 Sub OnError_Example1 () Dim i som heltal, j som heltal, k som heltal 

För alla dessa tre variabler kommer jag att tilldela divisionsberäkning.

Koda:

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

Resultatet av alla dessa tre beräkningar visas i meddelandefältet.

Koda:

 Sub OnError_Example1 () Dim i som heltal, j som heltal, k som heltal i = 20/0 j = 20/2 k = 10/5 MsgBox "Värdet på i är" & i & vbNewLine & "Värdet på j är "& j & _ vbNewLine &" Värdet för k är "& k & vbNewLine End Sub 

Nu ska jag försöka köra den här koden eftersom beräkningen av "jag" inte är korrekt kommer vi att få körtidsfel 11.

Nu ska jag lägga till uttalandet ”On Error Resume Next”.

Koda:

 Sub OnError_Example1 () Dim i som heltal, j som heltal, k som heltal vid fel Återuppta nästa i = 20/0 j = 20/2 k = 10/5 MsgBox "Värdet på i är" & i & vbNewLine & "The värdet på j är "& j & _ vbNewLine &" Värdet på k är "& k & vbNewLine End Sub 

Om jag utför detta hoppar det över "I" -beräkningen och utför de återstående två beräkningarna och resultatet blir som följer.

Nu istället för "On Error Resume Next" lägger jag till "On Error GoTo KCalculation"

Koda:

 Sub OnError_Example1 () Dim i som heltal, j som heltal, k som heltal vid fel GoTo KCalculation: i = 20/0 j = 20/2 KCalculation: k = 10/5 MsgBox "Värdet på i är" & i & vbNewLine & "Värdet för j är" & j & _ vbNewLine & "Värdet för k är" & k & vbNewLine End Sub 

Obs: Här är ”KCalculation” det namn jag gav, du kan ge ditt eget etikettnamn utan utrymme.

Om jag nu kör den här raden med kod kommer den inte att hoppa till nästa rad utan den kommer att hoppa till etikettnamnet jag har angett, dvs. ”KCalcualtion”. Här kommer den att ignorera felet från "I" och det kommer inte heller att utföra "j" -beräkning men genast hoppar det till "KCalcualtion".

# 3 - Skriv ut felnummer i VBA

I slutet av koden kan vi också skriva ut felnumret i en separat meddelanderuta. Följande kodrad kommer att göra detta jobb.

Koda:

Felnummer

Nu kommer jag att köra den här koden första meddelandefältet visar beräkningsresultaten.

Klicka på OK, det kommer att visa ytterligare ett meddelandefält för att visa felnumret.

Vi blir 11 som resultatet, dvs. 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.