När du behöver hantera fel i Excel VBA kan du använda OnError-satsen. Det finns dock några saker du behöver veta först. Du kan använda On Error-satsen på tre sätt.
| Syntax |
Vad den gör |
| Vid fel GoTo- etikett |
Efter att ha kört denna sats återupptar VBA exekveringen vid
satsen efter den angivna etiketten. Du måste inkludera ett kolon
efter etiketten så att VBA känner igen den som en etikett. |
| Vid fel GoTo 0 |
Efter att ha kört denna sats återupptar VBA sitt normala
felkontrollbeteende. Använd denna sats efter att ha använt någon av de
andra On Error-satserna eller när du vill ta bort felhantering
i din procedur. |
| Vid fel Resume Next |
Efter att ha kört denna sats ignorerar VBA helt enkelt alla fel
och återupptar körningen med nästa sats. |
Återupptas efter ett fel
I vissa fall vill du helt enkelt att rutinen ska avslutas graciöst när ett fel inträffar. Du kan till exempel visa ett meddelande som beskriver felet och sedan avsluta proceduren. (Exemplet EnterSquareRoot5 som visades tidigare använder den här tekniken.) I andra fall vill du återhämta dig från felet, om möjligt.
För att återställa ett fel måste du använda ett CV-uttalande. Detta rensar feltillståndet och låter dig fortsätta körningen på någon plats. Du kan använda CV-meddelandet på tre sätt.
| Syntax |
Vad den gör |
| Återuppta |
Körningen återupptas med satsen som orsakade felet. Använd
detta om din felhanteringskod löser problemet och
det är okej att fortsätta. |
| Fortsätt Nästa |
Utförandet återupptas med satsen omedelbart efter
satsen som orsakade felet. Detta ignorerar i huvudsak
felet. |
| Återuppta etikett |
Körningen återupptas vid den etikett du anger. |
Följande exempel använder en Resume-sats efter att ett fel uppstår:
Sub EnterSquareRoot6()
Dim Num Som Variant
Dim Msg As String
Dim Ans Som heltal
Försök igen:
' Ställ in felhantering
Vid fel GoTo BadEntry
' Fråga efter ett värde
Num = InputBox(”Ange ett värde”)
Om Num = ““ Avsluta Sub
' Infoga kvadratroten
ActiveCell.Value = Sqr(Num)
Avsluta Sub
BadEntry:
Msg = Err.Number & “: “ & Error(Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Msg & "Se till att ett intervall är valt, "
Msg = Msg & "arket är inte skyddat",
Msg = Msg & "och du anger ett icke-negativt värde."
Msg = Msg & vbNewLine & vbNewLine & "Försök igen?"
Ans = MsgBox(Msg, vbYesNo + vbCritical)
Om Ans = vbYes Återuppta försök igen
Avsluta Sub
Denna procedur har en annan etikett: TryAgain. Om ett fel uppstår fortsätter exekveringen vid BadEntry-etiketten och koden visar meddelandet nedan. Om användaren svarar genom att klicka på Ja, startar Resume-satsen och körningen hoppar tillbaka till TryAgain-etiketten. Om användaren klickar på Nej, avslutas proceduren.

Om ett fel uppstår kan användaren bestämma om han vill försöka igen.
Observera att felmeddelandet även innehåller felnumret, tillsammans med den "officiella" felbeskrivningen.
Resume-satsen rensar feltillståndet innan du fortsätter. För att se detta, försök att ersätta följande sats med den näst sista satsen i föregående exempel:
Om Ans = vbYes Gå till Försök igen
Koden fungerar inte korrekt om du använder GoTo istället för Resume. För att demonstrera, ange ett negativt tal. Du får felmeddelandet. Klicka på Ja för att försöka igen och ange ett annat negativt tal. Detta andra fel fångas inte eftersom det ursprungliga feltillståndet inte rensades.
Felhantering i ett nötskal
Här är en snabb och smutsig sammanfattning för att hjälpa dig att hålla alla dessa felhanteringsaffärer raka. Ett block med felhanteringskod har följande egenskaper:
-
Det börjar omedelbart efter etiketten som anges i On Error-satsen.
-
Det bör bara nås av ditt makro om ett fel uppstår. Det betyder att du måste använda en sats som Exit Sub eller Exit Function omedelbart före etiketten.
-
Det kan kräva ett CV-uttalande. Om du väljer att inte avbryta proceduren när ett fel uppstår, måste du köra en Resume-sats innan du återgår till huvudkoden.
Att veta när man ska ignorera fel
I vissa fall är det helt okej att ignorera fel. Det är då uttalandet On Error Resume Next kommer in i bilden.
Följande exempel går igenom varje cell i det valda området och konverterar värdet till dess kvadratrot. Den här proceduren genererar ett felmeddelande om någon cell i markeringen innehåller ett negativt tal eller text:
Sub SelectionSqrt()
Dim cell som intervall
Om TypeName(Selection) <> "Range" Avsluta Sub
För varje cell i urval
cell.Value = Sqr(cell.Value)
Nästa cell
Avsluta Sub
I det här fallet kanske du helt enkelt vill hoppa över en cell som innehåller ett värde som du inte kan konvertera till en kvadratrot. Du kan skapa alla möjliga felkontrollfunktioner genom att använda If-Then-strukturer, men du kan skapa en bättre (och enklare) lösning genom att helt enkelt ignorera de fel som uppstår.
Följande rutin åstadkommer detta genom att använda påståendet Vid Fel Resume Next:
Sub SelectionSqrt()
Dim cell som intervall
Om TypeName(Selection) <> "Range" Avsluta Sub
Vid fel Resume Next
För varje cell i urval
cell.Value = Sqr(cell.Value)
Nästa cell
Avsluta Sub
I allmänhet kan du använda en On Error Resume Next-sats om du anser att felen är ofarliga eller oviktiga för din uppgift.