Med felhanterare kan du ange vad som händer när ett fel påträffas medan din Excel-makrokod körs. Felhanterare är rader som liknar följande:
Vid fel GoTo MyError
Utan felhanterare kommer alla fel som uppstår i din kod att uppmana Excel att aktivera ett mindre än användbart felmeddelande som vanligtvis inte tydligt visar vad som hände. Men med hjälp av felhanterare kan du välja att ignorera felet eller avsluta koden med ditt eget meddelande till användaren.
Det finns tre typer av On Error-meddelanden:
-
Vid fel GoTo SomeLabel: Koden hoppar till den angivna etiketten.
-
Vid återuppta fel nästa: Felet ignoreras och koden återupptas.
-
Vid fel GoTo 0: VBA återställs till normalt felkontrollbeteende.
Vid fel GoTo SomeLabel
Ibland innebär ett fel i din kod att du måste avsluta proceduren och ge dina användare ett tydligt meddelande. I dessa situationer kan du använda On Error GoTo-satsen för att tala om för Excel att hoppa till en viss kodrad.
Till exempel, i följande lilla kodbit ber du Excel att dividera värdet i cell A1 med värdet i cell A2 och sedan placera svaret i cell A3. Lätt. Vad kan gå fel?
Sub Macro1()
Range("A3").Value = Range("A1").Value / Range("A2").Value
Avsluta Sub
Som det visar sig kan två stora saker gå fel. Om cell A2 innehåller 0 får du ett divideringsfel med 0. Om cell A2 innehåller ett icke-numeriskt värde får du ett typfel.
För att undvika ett otäckt felmeddelande kan du tala om för Excel att vid fel vill du att koden ska hoppa till etiketten MyExit.
I följande kod följs MyExit-etiketten av ett meddelande till användaren som ger vänliga råd istället för ett otäckt felmeddelande. Notera också Exit Sub-raden före MyExit-etiketten, som säkerställer att koden helt enkelt avslutas om inget fel uppstår:
Sub Macro1()
Vid fel GoTo MyExit
Range("A3").Value = Range("A1").Value / Range("A2").Value
Avsluta Sub
MyExit:
MsgBox "Vänligen använd giltiga nummer som inte är noll"
Avsluta Sub
Vid fel Resume Next
Ibland vill du att Excel ska ignorera ett fel och helt enkelt fortsätta köra koden. I dessa situationer kan du använda påståendet Vid Fel Resume Next.
Till exempel är följande kodbit avsedd att ta bort en fil som heter GhostFile.exe från C:Temp-katalogen. När filen har raderats, talar en trevlig meddelanderuta om för användaren att filen är borta:
Sub Macro1()
Döda "C:TempGhostFile.exe"
MsgBox "Filen har tagits bort."
Avsluta Sub
Koden fungerar utmärkt om det verkligen finns en fil att radera. Men om filen som heter GhostFile.exe av någon anledning inte finns i C:Temp-enheten, uppstår ett fel.
I det här fallet bryr du dig inte om filen inte finns där eftersom du ändå skulle ta bort den. Så du kan helt enkelt ignorera felet och gå vidare med koden.
Genom att använda On Error Resume Next-satsen kör koden sin kurs oavsett om den riktade filen finns eller inte:
Sub Macro1()
Vid fel Resume Next
Döda "C:TempGhostFile.exe"
MsgBox "Filen har tagits bort."
Avsluta Sub
Vid fel GoTo 0
När du använder vissa felsatser kan det vara nödvändigt att återställa VBAs felkontrollbeteende. För att förstå vad detta betyder, ta en titt på nästa exempel.
Här vill du först ta bort en fil som heter GhostFile.exe från C:Temp-katalogen. För att undvika fel som kan bero på att den riktade filen inte finns, använder du satsen On Error Resume Next. Efter det försöker du göra lite misstänkt matematik genom att dividera 100/Mike:
Sub Macro1()
Vid fel Resume Next
Döda "C:TempGhostFile.exe"
Range("A3").Värde = 100 / "Mike"
Avsluta Sub
Att köra den här kodbiten borde generera ett fel på grund av den otydliga matematiken, men det gör det inte. Varför? Eftersom den senaste instruktionen du gav till koden var On Error Resume Next. Alla fel som uppstår efter den raden ignoreras i praktiken.
För att lösa detta problem kan du använda On Error GoTo 0-satsen för att återuppta normala felkontrollbeteende:
Sub Macro1()
Vid fel Resume Next
Döda "C:TempGhostFile.exe"
Vid fel GoTo 0
Range("A3").Värde = 100 / "Mike"
Avsluta Sub
Denna kod kommer att ignorera fel tills On Error GoTo 0-satsen. Efter det uttalandet går koden tillbaka till normal felkontroll och utlöser det förväntade felet som härrör från den otydliga matematiken.