VBA On Error - Felhantering av bästa praxis

VBA -fel Cheat Sheet

Fel

BeskrivningVBA -kodOn Error - Stoppkod och visningsfelVid fel Gå till 0Vid fel - Hoppa över fel och fortsätt köraVid fel Återuppta nästaVid fel - Gå till en kodrad [Etikett]Vid fel Gå till [Etikett]Rensar (återställer) felVid fel GoTo -1Visa felnummerMsgBox Err.NummerVisa felbeskrivningMsgBox Err.BeskrivningFunktion för att generera eget felErr.Rise

Se mer VBA “Cheat Sheets” och gratis PDF -nedladdningar

VBA -felhantering

VBA -felhantering avser processen att förutse, upptäcka och lösa VBA -körtidsfel. VBA -felhanteringsprocessen sker när du skriver kod innan några fel uppstår.

VBA -körtidsfel är fel som uppstår vid kodkörning. Exempel på körtidsfel inkluderar:

  • Hänvisning till en obefintlig arbetsbok, kalkylblad eller annat objekt
  • Ogiltig data ex. refererar till en Excel -cell som innehåller ett fel
  • Försöker dela med noll

VBA om felmeddelande

De flesta VBA -felhanteringar görs med På felmeddelande. On Error -satsen säger till VBA vad de ska göra om det uppstår ett fel. Det finns tre På felmeddelanden:

  • Vid fel GoTo 0
  • Vid fel Återuppta nästa
  • Vid fel GoTo Linje

Vid fel GoTo 0

Vid fel GoTo 0 är VBA: s standardinställning. Du kan återställa denna standardinställning genom att lägga till följande kodrad:

1 Vid fel GoTo 0

När ett fel uppstår med Vid fel GoTo 0, Kommer VBA att sluta köra koden och visa sin standardfelmeddelande.

Ofta lägger du till en Vid fel GoTo 0 efter att ha lagt till Vid fel Återuppta nästa felhantering (nästa avsnitt):

123456789 Sub ErrorGoTo0 ()Vid fel Återuppta nästaActiveSheet.Shapes ("Start_Button"). RaderaVid fel GoTo 0'Kör mer kodAvsluta Sub

Vid fel Återuppta nästa

Vid fel Återuppta nästa uppmanar VBA att hoppa över alla kodrader som innehåller fel och gå vidare till nästa rad.

1 Vid fel Återuppta nästa

Notera: Vid fel Återuppta nästa åtgärdar inte ett fel eller på annat sätt löser det. Det berättar helt enkelt för VBA att fortsätta som om kodraden som innehåller felet inte fanns. Felaktig användning av Vid fel Återuppta nästa kan leda till oavsiktliga konsekvenser.

En bra tid att använda Vid fel Återuppta nästa är när man arbetar med objekt som kanske finns eller inte finns. Till exempel vill du skriva en kod som tar bort en form, men om du kör koden när formen redan är borttagen kommer VBA att kasta ett fel. Istället kan du använda Vid fel Återuppta nästa att berätta för VBA att ta bort formen om den finns.

123 Vid fel Återuppta nästaActiveSheet.Shapes ("Start_Button"). RaderaVid fel GoTo 0

Lägg märke till att vi har lagt till Vid fel GoTo 0 efter kodraden som innehåller det potentiella felet. Detta återställer felhanteringen.

I nästa avsnitt visar vi dig hur du testar om ett fel uppstod med Err.Nummer, vilket ger dig mer avancerade alternativ för felhantering …

Err.Number, Err.Clear och Catching -fel

Istället för att helt enkelt hoppa över en rad som innehåller ett fel kan vi fånga felet med hjälp av Vid fel Återuppta nästa och Err.Nummer.

Err.Nummer returnerar ett felnummer som motsvarar den typ av fel som upptäckts. Om det inte finns något fel, Err.Nummer = 0.

Till exempel returnerar denna procedur “11” eftersom felet som uppstår är Körtidsfel '11'.

1234567 Sub ErrorNumber_ex ()Vid fel Återuppta nästaActiveCell.Value = 2 /0MsgBox Err.NummerAvsluta Sub

Fel vid hantering av Err.Number

Den sanna kraften i Err.Nummer ligger i möjligheten att upptäcka om ett fel inträffade (Err.Nummer 0). I exemplet nedan har vi skapat en funktion som testar om ett ark finns med Err.Number.

12345678910111213141516171819 SubtestWS ()MsgBox DoesWSExist ("test")Avsluta SubFunktion DoesWSExist (wsName As String) Som BooleanDim ws Som arbetsbladVid fel Återuppta nästaAnge ws = Sheets (wsName)'Om fel WS inte existerarOm Err.Number 0 DåDoesWSExist = FalsktAnnanDoesWSExist = TrueAvsluta omVid fel GoTo -1Avsluta funktion

Obs: Vi har lagt till en Vid fel GoTo -1 till slutet som återställer Err.Number till 0 (se två avsnitt nedåt).

Med Vid fel Återuppta nästa och Err.Nummer, kan du replikera "Försök fånga" andra programmeringsspråk.

Vid fel GoTo Linje

Vid fel GoTo Linje uppmanar VBA att "gå till" en märkt kodrad när ett fel uppstår. Du deklarerar Go To -uttalandet så här (där errHandler är radetiketten att gå till):

1 Vid fel GoTo errHandler

och skapa en radetikett så här:

1 errHandler:

Obs! Detta är samma etikett som du skulle använda med ett vanligt VBA GoTo -uttalande.

Nedan visar vi hur du använder Vid fel GoTo Linje att avsluta ett förfarande.

Vid fel Avsluta sub

Du kan använda On Error GoTo Line för att avsluta en sub när ett fel uppstår.

Du kan göra detta genom att placera etiketten för felhanterare i slutet av proceduren:

12345678 Sub ErrGoToEnd ()Vid fel GoTo endProc'Någon kodendProc:Avsluta Sub

eller genom att använda kommandot Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()Vid fel GoTo endProc'Någon kodGå till SkipExitendProc:Avsluta Subhoppa över:'Lite mer kodAvsluta Sub

Err.Clear, On Error GoTo -1 och Resetting Err.Number

När ett fel hanteras bör du i allmänhet rensa felet för att förhindra framtida problem med felhantering.

När ett fel uppstår, både Err.Tydlig och Vid fel GoTo -1 kan användas för att återställa Err.Nummer till 0. Men det är en mycket viktig skillnad: Err.Tydlig återställer inte själva felet, det återställer bara Err.Nummer.

Vad betyder det? Använder sig avErr.Tydlig, kommer du inte att kunna ändra inställningen för felhantering. För att se skillnaden, testa den här koden och byt ut den Vid fel GoTo -1 med Err.Tydlig:

123456789101112131415161718192021 Sub ErrExempel ()Vid fel GoTo errHandler:'"Programdefinierat" felFel (13)Avsluta SuberrHandler:'Rensa felVid fel GoTo -1Vid fel GoTo errHandler2:"" Felaktig typ av fel "Fel (1034)Avsluta SuberrHandler2:Debug.Print Err.DescriptionAvsluta Sub

Vanligtvis rekommenderar jag att alltid använda Vid fel GoTo -1, om du inte har en bra anledning att använda Err.Tydlig istället.

VBA vid fel MsgBox

Du kanske också vill visa en meddelanderuta vid fel. I det här exemplet visas olika meddelanderutor beroende på var felet uppstår:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg Som strängVid fel GoTo errHandler'Steg 1errMsg = "Ett fel uppstod under kopiera och klistra in."'Err.Raise (11)'Steg 2errMsg = "Ett fel uppstod under datavalideringssteget."'Err.Raise (11)'Steg 3errMsg = "Ett fel uppstod under P & L-Building och Copy-Over-scenen."Err.Raise (11)'Steg 4errMsg = "Ett fel uppstod vid försök att logga importen på installationssidan"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Avsluta Sub

Här skulle du ersätta Err.Raise (11) med din faktiska kod.

VBA IsError

Ett annat sätt att hantera fel är att testa för dem med VBA IsError -funktionen. IsError -funktionen testar ett uttryck för fel och returnerar TRUE eller FALSE om ett fel uppstår.

123 Sub IsErrorEx ()MsgBox IsError (intervall ("a7"). Värde)Avsluta Sub

Om fel VBA

Du kan också hantera fel i VBA med Excel IfError -funktionen. IfError -funktionen måste nås med Arbetsblad Funktionsklass:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (intervall ("a10"). Värde, 0)MsgBox nAvsluta Sub

Detta matar ut värdet för intervall A10, om värdet är ett fel kommer det att mata ut 0 istället.

VBA -feltyper

Körtidsfel

Som nämnts ovan:

VBA -körtidsfel är fel som uppstår vid kodkörning. Exempel på körtidsfel inkluderar:

  • Hänvisning till en obefintlig arbetsbok, kalkylblad eller annat objekt
  • Ogiltig data ex. refererar till en Excel -cell som innehåller ett fel
  • Försöker dela med noll

Du kan "fel hantera" körtidsfel med metoderna som diskuterats ovan.

Syntaxfel

VBA -syntaxfel är fel med kodskrivning. Exempel på syntaxfel inkluderar:

  • Felstavning
  • Saknas eller felaktig skiljetecken

VBA Editor identifierar många syntaxfel med röd markering:

VBA Editor har också ett alternativ till "Auto Syntax Check":

När detta är markerat genererar VBA Editor en meddelanderuta som varnar dig för syntaxfel efter att du har angett en kodrad:

Jag personligen tycker att detta är extremt irriterande och inaktiverar funktionen.

Kompilera fel

Innan du försöker köra ett förfarande kommer VBA att "kompilera" proceduren. Kompilering omvandlar programmet från källkod (som du kan se) till körbar form (du kan inte se).

VBA -kompileringsfel är fel som hindrar koden från att kompilera.

Ett bra exempel på ett kompileringsfel är en variabeldeklaration som saknas:

Andra exempel inkluderar:

  • För utan Nästa
  • Välj utan Avsluta Välj
  • Om utan Avsluta om
  • Ringer a procedur som inte finns

Syntaxfel (föregående avsnitt) är en delmängd av kompileringsfel.

Debug> Kompilera

Kompileringsfel visas när du försöker köra ett förfarande. Men helst skulle du identifiera kompileringsfel innan du försöker köra proceduren.

Du kan göra detta genom att sammanställa projektet i förväg. För att göra det, gå till Debug> Kompilera VBA -projekt.

Kompilatorn kommer att "gå till" det första felet. När du har åtgärdat felet kompilerar du projektet igen. Upprepa tills alla fel har åtgärdats.

Du kan se att alla fel är åtgärdade pga Kompilera VBA -projekt kommer att nedtonas:

Overflow -fel

De VBA OverFlow -fel uppstår när du försöker sätta in ett värde i en variabel som är för stor. Till exempel, Integer Variabler kan bara innehålla värden mellan -32,768 till 32,768. Om du anger ett större värde får du ett Overflow -fel:

Istället bör du använda Lång variabel för att lagra det större numret.

Andra VBA -felvillkor

VBA Catch Error

Till skillnad från andra programmeringsspråk finns det inget i VBA Fånga uttalande. Du kan dock replikera en fångstdeklaration med Vid fel Återuppta nästa och Om Err.Number 0 Då. Detta täcks ovan i Felhantering med Err.Number.

VBA Ignorera fel

För att ignorera fel i VBA, använd helt enkelt Vid fel Återuppta nästa påstående:

1 Vid fel Återuppta nästa

Som nämnts ovan bör du dock vara försiktig med att använda detta uttalande eftersom det inte åtgärdar ett fel, det ignorerar helt enkelt kodraden som innehåller felet.

VBA -kastfel / Err.Raise

För att genom ett fel i VBA använder du Err.Rise metod.

Denna kodrad kommer att öka Run-time error '13': Typmatchning:

1 Err.Raise (13)

VBA -felinställning

VBA -felinställning är bara en annan term för VBA -felhantering.

VBA -felmeddelande

A VBA -felmeddelande ser ut så här:

När du klickar på "Debug" ser du kodraden som kastar felet:

VBA -felhantering i en loop

Det bästa sättet att fel hantera inom en loop är att använda Vid fel Återuppta nästa tillsammans med Err.Nummer för att upptäcka om ett fel har inträffat (Kom ihåg att använda Err.Tydlig för att rensa felet efter varje händelse).

Exemplet nedan kommer att dela två nummer (kolumn A med kolumn B) och mata ut resultatet i kolumn C. Om det finns ett fel blir resultatet 0.

12345678910111213141516 Deltest ()Dim cell As RangeVid fel Återuppta nästaFör varje cell i intervallet ("a1: a10")'Ställ in cellvärdecell.Offset (0, 2) .Värde = cell.Värde / cell.Offset (0, 1) .Värde'Om Cell.Value är fel är standard till 0Om Err.Number 0 Dåcell.Offset (0, 2) .Värde = 0Err.TydligAvsluta omNästaAvsluta Sub

VBA -felhantering vid åtkomst

Alla ovanstående exempel fungerar exakt likadant i Access VBA som i Excel VBA.

123456789101112131415161718 Funktion DelRecord (frm som form)'den här funktionen används för att radera en post i en tabell från ett formulärVid fel GoTo endingMed frmOm .NewRecord Då.ÅngraAvsluta funktionAvsluta omSluta medMed frm.RecordsetClone.Bokmärke = frm.Bokmärke.Raderafrm.KravSluta medAvsluta funktionslut:SlutetAvsluta funktion

Du kommer att bidra till utvecklingen av webbplatsen, dela sidan med dina vänner

wave wave wave wave wave