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.RaiseSe 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 |