VBA On Error - Fejlhåndtering af bedste praksis

VBA fejl Cheat Sheet

Fejl

BeskrivelseVBA -kodeOn Error - Stop kode og vis fejlVed fejl Gå til 0Ved fejl - Spring fejl over, og fortsæt med at køreVed fejl Genoptag næsteVed fejl - Gå til en kodelinje [Etiket]Ved fejl Goto [Label]Sletter (nulstiller) fejlVed fejl GoTo -1Vis fejlnummerMsgBox Err.NummerVis fejlbeskrivelseMsgBox Err.BeskrivelseFunktion til at generere egen fejlErr.Raise

Se mere VBA “Snydark” og gratis PDF -downloads

VBA fejlhåndtering

VBA fejlhåndtering refererer til processen med at forudse, opdage og løse VBA Runtime -fejl. VBA -fejlhåndteringsprocessen opstår, når du skriver kode, før der rent faktisk opstår fejl.

VBA Kørselsfejl er fejl, der opstår under kodeudførelse. Eksempler på runtime fejl omfatter:

  • Henvisning til en ikke-eksisterende projektmappe, regneark eller et andet objekt
  • Ugyldige data eks. der henviser til en Excel -celle, der indeholder en fejl
  • Forsøger at dividere med nul

VBA om fejlmeddelelse

De fleste VBA -fejlhåndteringer udføres med På fejlmeddelelse. On Error -sætningen fortæller VBA, hvad de skal gøre, hvis den støder på en fejl. Der er tre Om fejlmeddelelser:

  • Ved fejl GoTo 0
  • Ved fejl Genoptag næste
  • Ved fejl GoTo Line

Ved fejl GoTo 0

Ved fejl GoTo 0 er VBAs standardindstilling. Du kan gendanne denne standardindstilling ved at tilføje følgende kodelinje:

1 Ved fejl GoTo 0

Når der opstår en fejl med Ved fejl GoTo 0, Stopper VBA med at eksekvere kode og viser sin standard fejlmeddelelsesboks.

Ofte vil du tilføje en Ved fejl GoTo 0 efter tilføjelse Ved fejl Genoptag næste fejlhåndtering (næste afsnit):

123456789 Sub ErrorGoTo0 ()Ved fejl Genoptag næsteActiveSheet.Shapes ("Start_Button"). SletVed fejl GoTo 0'Kør mere kodeAfslut Sub

Ved fejl Genoptag næste

Ved fejl Genoptag næste fortæller VBA at springe alle kodelinjer over, der indeholder fejl, og fortsætte til den næste linje.

1 Ved fejl Genoptag næste

Bemærk: Ved fejl Genoptag næste løser ikke en fejl eller på anden måde løser den. Det fortæller simpelthen VBA at fortsætte, som om kodelinjen, der indeholder fejlen, ikke eksisterede. Forkert brug af Ved fejl Genoptag næste kan få utilsigtede konsekvenser.

En god tid at bruge Ved fejl Genoptag næste er, når man arbejder med objekter, der muligvis ikke findes. For eksempel vil du skrive en kode, der sletter en figur, men hvis du kører koden, når figuren allerede er slettet, vil VBA udsende en fejl. I stedet kan du bruge Ved fejl Genoptag næste at fortælle VBA at slette formen, hvis den findes.

123 Ved fejl Genoptag næsteActiveSheet.Shapes ("Start_Button"). SletVed fejl GoTo 0

Bemærk, vi tilføjede Ved fejl GoTo 0 efter kodelinjen, der indeholder den potentielle fejl. Dette nulstiller fejlhåndteringen.

I det næste afsnit viser vi dig, hvordan du tester, om der opstod en fejl ved hjælp af Err.Nummer, hvilket giver dig mere avancerede muligheder for fejlhåndtering …

Err.Number, Err.Clear og Catching -fejl

I stedet for blot at springe over en linje, der indeholder en fejl, kan vi fange fejlen ved at bruge Ved fejl Genoptag næste og Err.Nummer.

Err.Nummer returnerer et fejlnummer, der svarer til den registrerede fejltype. Hvis der ikke er nogen fejl, Err.Nummer = 0.

For eksempel returnerer denne procedure "11", fordi den fejl, der opstår, er Kørselsfejl '11'.

1234567 Sub ErrorNumber_ex ()Ved fejl Genoptag næsteActiveCell.Value = 2 /0MsgBox Err.NummerAfslut Sub

Fejl ved håndtering med Err.Number

Den sande kraft af Err.Nummer ligger i evnen til at opdage, om der opstod en fejl (Err.Nummer 0). I eksemplet herunder har vi oprettet en funktion, der tester, om der findes et ark ved hjælp af Err.Number.

12345678910111213141516171819 SubtestWS ()MsgBox DoesWSExist ("test")Afslut SubFunktion eksistererWSExist (wsName som streng) som boolskDim ws Som regnearkVed fejl Genoptag næsteIndstil ws = Sheets (wsName)'Hvis fejl WS ikke findesHvis Err.Number 0 SåDoesWSExist = FalskAndetDoesWSExist = TrueAfslut HvisVed fejl GoTo -1Afslut funktion

Bemærk: Vi har tilføjet en Ved fejl GoTo -1 til enden, som nulstiller Err.Number til 0 (se to afsnit nede).

Med Ved fejl Genoptag næste og Err.Nummer, kan du gentage "Prøv" og "Fang" andre programmeringssprogs funktionalitet.

Ved fejl GoTo Line

Ved fejl GoTo Line fortæller VBA at "gå til" en mærket kodelinje, når der opstår en fejl. Du erklærer Go To -erklæringen sådan (hvor errHandler er linjemærkaten at gå til):

1 Ved fejl GoTo errHandler

og opret en linjemærke som denne:

1 errHandler:

Bemærk: Dette er den samme etiket, som du ville bruge med en almindelig VBA GoTo -erklæring.

Nedenfor vil vi demonstrere brug af Ved fejl GoTo Line at afslutte en procedure.

Ved fejl Afslut sub

Du kan bruge On Error GoTo Line til at afslutte en sub, når der opstår en fejl.

Du kan gøre dette ved at placere etiketten med fejlhåndteringslinjen ved afslutningen af ​​din procedure:

12345678 Sub ErrGoToEnd ()Ved fejl GoTo endProc'Nogle koderendProc:Afslut Sub

eller ved at bruge kommandoen Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()Ved fejl GoTo endProc'Nogle koderGå til SkipExitendProc:Afslut Subspring ud:'Noget mere kodeAfslut Sub

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

Når en fejl er håndteret, bør du generelt rydde fejlen for at forhindre fremtidige problemer med fejlhåndtering.

Efter en fejl opstår, begge Err.Klar og Ved fejl GoTo -1 kan bruges til at nulstille Err.Nummer til 0. Men der er en meget vigtig forskel: Err.Klar nulstiller ikke selve den faktiske fejl, nulstiller den kun Err.Nummer.

Hvad betyder det? Ved brug afErr.Klar, vil du ikke kunne ændre indstillingen for fejlhåndtering. For at se forskellen, test denne kode og udskift den Ved fejl GoTo -1 med Err.Klar:

123456789101112131415161718192021 Sub ErrExempler ()Ved fejl GoTo errHandler:'"Applikationsdefineret" fejlFejl (13)Afslut SuberrHandler:'Ryd fejlVed fejl GoTo -1Ved fejl GoTo errHandler2:'"Fejl i type mismatch"Fejl (1034)Afslut SuberrHandler2:Debug.Print Err.BeskrivelseAfslut Sub

Normalt anbefaler jeg altid at bruge Ved fejl GoTo -1, medmindre du har en god grund til at bruge Err.Klar i stedet.

VBA ved fejl MsgBox

Du vil muligvis også vise en meddelelsesboks ved fejl. Dette eksempel viser forskellige meddelelsesbokse afhængigt af, hvor fejlen opstår:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg Som strengVed fejl GoTo errHandler'Scene 1errMsg = "Der opstod en fejl under scenen Kopier og indsæt."'Err.Raise (11)'Etape 2errMsg = "Der opstod en fejl under datavalideringsfasen."'Err.Raise (11)'Etape 3errMsg = "Der opstod en fejl under P & L-Building- og Copy-Over-fasen."Err.Raise (11)'Etape 4errMsg = "Der opstod en fejl under forsøg på at logge importen på opsætningssiden"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Afslut Sub

Her ville du erstatte Err.Raise (11) med din faktiske kode.

VBA er fejl

En anden måde at håndtere fejl på er at teste dem med VBA IsError -funktionen. IsError -funktionen tester et udtryk for fejl, returnerer SANDT eller FALSKT, hvis der opstår en fejl.

123 Sub IsErrorEx ()MsgBox IsError (område ("a7"). Værdi)Afslut Sub

Hvis fejl VBA

Du kan også håndtere fejl i VBA med Excel IfError -funktionen. IfError -funktionen skal tilgås ved hjælp af Arbejdsark Funktionsklasse:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (område ("a10"). Værdi, 0)MsgBox nAfslut Sub

Dette udsender værdien for område A10, hvis værdien er en fejl, udsender den i stedet 0.

VBA -fejltyper

Kørselsfejl

Som anført ovenfor:

VBA Kørselsfejl er fejl, der opstår under kodeudførelse. Eksempler på runtime fejl omfatter:

  • Henvisning til en ikke-eksisterende projektmappe, regneark eller et andet objekt
  • Ugyldige data eks. der henviser til en Excel -celle, der indeholder en fejl
  • Forsøger at dividere med nul

Du kan "fejl håndtere" runtime fejl ved hjælp af metoderne diskuteret ovenfor.

Syntaksfejl

VBA -syntaksfejl er fejl med kodeskrivning. Eksempler på syntaksfejl omfatter:

  • Fejlfinding
  • Manglende eller forkert tegnsætning

VBA Editor identificerer mange syntaksfejl med rød fremhævelse:

VBA Editor har også en mulighed for "Automatisk syntakscheck":

Når dette er markeret, genererer VBA Editor en meddelelsesboks, der advarer dig om syntaksfejl, efter at du har indtastet en linje med kode:

Jeg synes personligt, at dette er ekstremt irriterende og deaktiverer funktionen.

Kompiler fejl

Inden et forsøg på at køre en procedure "kompilerer" VBA proceduren. Kompilering forvandler programmet fra kildekoden (som du kan se) til en eksekverbar form (du kan ikke se).

VBA -kompileringsfejl er fejl, der forhindrer koden i at kompilere.

Et godt eksempel på en kompileringsfejl er en manglende variabeldeklaration:

Andre eksempler omfatter:

  • Til uden Næste
  • Vælg uden Afslut Vælg
  • Hvis uden Afslut Hvis
  • Ringer til a procedure der findes ikke

Syntaksfejl (forrige afsnit) er en undersæt af kompileringsfejl.

Debug> Kompiler

Kompileringsfejl vises, når du forsøger at køre en procedure. Men ideelt set ville du identificere kompileringsfejl, før du forsøgte at køre proceduren.

Du kan gøre dette ved at sammensætte projektet på forhånd. For at gøre det skal du gå til Debug> Kompilér VBA -projekt.

Compilatoren vil "gå til" den første fejl. Når du har rettet fejlen, skal du kompilere projektet igen. Gentag, indtil alle fejl er rettet.

Du kan fortælle, at alle fejl er rettet pga Kompilér VBA -projekt vil blive nedtonet:

OverFlow -fejl

Det VBA OverFlow -fejl opstår, når du forsøger at sætte en værdi i en variabel, der er for stor. For eksempel, Heltalsvariabler kan kun indeholde værdier mellem -32.768 til 32.768. Hvis du indtaster en større værdi, modtager du en overløbsfejl:

I stedet skal du bruge Lang variabel at gemme det større antal.

Andre VBA -fejlbetingelser

VBA -fangstfejl

I modsætning til andre programmeringssprog er der i VBA ingen Fangsterklæring. Du kan dog replikere en fangsterklæring ved hjælp af Ved fejl Genoptag næste og Hvis Err.Number 0 Så. Dette er dækket ovenfor i Fejlhåndtering med Err.Number.

VBA Ignorer fejl

For at ignorere fejl i VBA skal du blot bruge Ved fejl Genoptag næste udmelding:

1 Ved fejl Genoptag næste

Som nævnt ovenfor skal du dog være forsigtig med at bruge denne erklæring, da den ikke retter en fejl, den ignorerer simpelthen kodelinjen, der indeholder fejlen.

VBA Throw Error / Err.Raise

For at gennemgå en fejl i VBA, bruger du Err.Raise metode.

Denne kodelinje vil øge Run-time fejl '13': Fejl i type:

1 Err.Raise (13)

VBA -fejlfangning

VBA -fejlfangning er bare endnu et udtryk for VBA -fejlhåndtering.

VBA -fejlmeddelelse

EN VBA -fejlmeddelelse ser sådan ud:

Når du klikker på 'Debug', ser du kodelinjen, der kaster fejlen:

VBA -fejlhåndtering i en loop

Den bedste måde at fejlhåndtere inden for en loop er ved at bruge Ved fejl Genoptag næste sammen med Err.Nummer for at opdage, om der er opstået en fejl (Husk at bruge Err.Klar for at slette fejlen efter hver forekomst).

Nedenstående eksempel deler to tal (kolonne A med kolonne B) og sender resultatet til kolonne C. Hvis der er en fejl, vil resultatet være 0.

12345678910111213141516 Deltest ()Dim celle som områdeVed fejl Genoptag næsteFor hver celle i området ("a1: a10")'Indstil celleværdicell.Offset (0, 2) .Værdi = cell.Værdi / cell.Offset (0, 1) .Værdi'Hvis Cell.Value er fejl, er standard til 0Hvis Err.Number 0 Såcelle.Offset (0, 2) .Værdi = 0Err.KlarAfslut HvisNæsteAfslut Sub

VBA -fejlhåndtering i adgang

Alle ovenstående eksempler fungerer nøjagtig det samme i Access VBA som i Excel VBA.

123456789101112131415161718 Funktion DelRecord (frm som form)'Denne funktion bruges til at slette en post i en tabel fra en formularVed fejl GoTo endingMed frmHvis .NyRecord Så.UndoAfslut funktionAfslut HvisAfslut medMed frm.RecordsetClone.Bogmærke = frm.Bogmærke.Sletfrm.KravAfslut medAfslut funktionSlutning:EndeAfslut funktion

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave