VBA -feil Jukseark
Feil
BeskrivelseVBA -kodePå feil - Stoppkode og visningsfeilVed feil Gå til 0On Error - Hopp over feil og fortsett å kjøreVed feil Fortsett nesteVed feil - Gå til en kodelinje [Etikett]Ved feil Gå til [Etikett]Sletter (tilbakestiller) feilVed feil GoTo -1Vis feilnummerMsgBox Err.NummerVis feilbeskrivelseMsgBox Err.BeskrivelseFunksjon for å generere egen feilErr.RaiseSe flere VBA "Cheat Sheets" og gratis PDF -nedlastinger
VBA -feilhåndtering
VBA -feilhåndtering refererer til prosessen med å forutse, oppdage og løse VBA -kjøretidsfeil. VBA -feilhåndteringsprosessen skjer når du skriver kode, før noen feil oppstår.
VBA -kjøretidsfeil er feil som oppstår under kjøring av kode. Eksempler på kjøretidsfeil inkluderer:
- Refererer til en ikke-eksisterende arbeidsbok, regneark eller annet objekt
- Ugyldige data eks. refererer til en Excel -celle som inneholder en feil
- Forsøk på å dele med null
VBA om feilmelding
De fleste VBA -feilhåndteringer er gjort med På feilmelding. On Error -setningen forteller VBA hva de skal gjøre hvis det oppstår en feil. Det er tre Om feilmeldinger:
- Ved feil GoTo 0
- Ved feil Fortsett neste
- På feil GoTo Linje
Ved feil GoTo 0
Ved feil GoTo 0 er standardinnstillingen for VBA. Du kan gjenopprette denne standardinnstillingen ved å legge til følgende kodelinje:
1 | Ved feil GoTo 0 |
Når det oppstår en feil med Ved feil GoTo 0, Vil VBA slutte å utføre kode og vise standard feilmeldingsboks.
Ofte vil du legge til en Ved feil GoTo 0 etter å ha lagt til Ved feil Fortsett neste feilhåndtering (neste avsnitt):
123456789 | Sub ErrorGoTo0 ()Ved feil Fortsett nesteActiveSheet.Shapes ("Start_Button"). SlettVed feil GoTo 0'Kjør mer kodeSlutt Sub |
Ved feil Fortsett neste
Ved feil Fortsett neste ber VBA hoppe over alle kodelinjer som inneholder feil og fortsette til neste linje.
1 | Ved feil Fortsett neste |
Merk: Ved feil Fortsett neste løser ikke en feil, eller på annen måte løser den. Den forteller ganske enkelt VBA å fortsette som om koderaden som inneholder feilen ikke eksisterte. Feil bruk av Ved feil Fortsett neste kan føre til utilsiktede konsekvenser.
En flott tid å bruke Ved feil Fortsett neste er når du arbeider med objekter som kanskje eksisterer eller ikke. For eksempel vil du skrive noen kode som vil slette en figur, men hvis du kjører koden når figuren allerede er slettet, vil VBA kaste en feil. I stedet kan du bruke Ved feil Fortsett neste å be VBA om å slette figuren hvis den eksisterer.
123 | Ved feil Fortsett nesteActiveSheet.Shapes ("Start_Button"). SlettVed feil GoTo 0 |
Legg merke til at vi la til Ved feil GoTo 0 etter koderaden som inneholder den potensielle feilen. Dette tilbakestiller feilhåndteringen.
I den neste delen viser vi deg hvordan du tester om det oppstod en feil ved bruk av Err.Nummergir deg mer avanserte alternativer for feilhåndtering …
Err.Number, Err.Clear og Catching Feil
I stedet for bare å hoppe over en linje som inneholder en feil, kan vi fange feilen ved å bruke Ved feil Fortsett neste og Err.Nummer.
Err.Nummer returnerer et feilnummer som tilsvarer typen feil som er oppdaget. Hvis det ikke er noen feil, Err.Nummer = 0.
For eksempel vil denne prosedyren returnere "11" fordi feilen som oppstår er Kjøretidsfeil '11'.
1234567 | Sub ErrorNumber_ex ()Ved feil Fortsett nesteActiveCell.Value = 2 /0MsgBox Err.NummerSlutt Sub |
Feil ved håndtering av Err.Number
Den sanne kraften til Err.Nummer ligger i evnen til å oppdage om det oppstod en feil (Err.Nummer 0). I eksemplet nedenfor har vi opprettet en funksjon som vil teste om det finnes et ark ved hjelp av Err.Number.
12345678910111213141516171819 | Sub TestWS ()MsgBox DoesWSExist ("test")Slutt SubFunksjon DoesWSExist (wsName As String) Som boolskDim ws Som regnearkVed feil Fortsett nesteSett ws = Sheets (wsName)'Hvis feil WS ikke eksistererHvis Err.Number 0 DaDoesWSExist = FalseEllersDoesWSExist = TrueSlutt omVed feil GoTo -1Sluttfunksjon |
Merk: Vi har lagt til en Ved feil GoTo -1 til slutten som tilbakestiller Err.Number til 0 (se to seksjoner ned).
Med Ved feil Fortsett neste og Err.Nummer, kan du replikere "Prøv" og "Fang" funksjonaliteten til andre programmeringsspråk.
På feil GoTo Linje
På feil GoTo Linje ber VBA om å "gå til" en merket kodelinje når det oppstår en feil. Du erklærer Go To -setningen slik (der errHandler er linjetiketten du skal gå til):
1 | Ved feil GoTo errHandler |
og lag en linjemerking som denne:
1 | errHandler: |
Merk: Dette er den samme etiketten som du ville bruke med en vanlig VBA GoTo -erklæring.
Nedenfor vil vi demonstrere bruk På feil GoTo Linje å avslutte en prosedyre.
Ved feil Avslutt sub
Du kan bruke On Error GoTo Line for å gå ut av en sub når det oppstår en feil.
Du kan gjøre dette ved å plassere etiketten for feilhåndteringslinje på slutten av prosedyren:
12345678 | Sub ErrGoToEnd ()Ved feil GoTo endProc'Noen koderendProc:Slutt Sub |
eller ved å bruke Exit Sub -kommandoen:
123456789101112131415 | Sub ErrGoToEnd ()Ved feil GoTo endProc'Noen koderGå til SkipExitendProc:Avslutt SubskipExit:'Noe mer kodeSlutt Sub |
Err.Clear, On Error GoTo -1, og Resetting Err.Number
Etter at en feil er håndtert, bør du vanligvis fjerne feilen for å forhindre fremtidige problemer med feilhåndtering.
Etter at det oppstår en feil, både Err.Klar og Ved feil GoTo -1 kan brukes til å tilbakestille Err.Nummer til 0. Men det er en veldig viktig forskjell: Err.Klar ikke tilbakestiller selve feilen, tilbakestiller den bare Err.Nummer.
Hva betyr det? Ved hjelp avErr.Klar, vil du ikke kunne endre innstillingen for feilhåndtering. For å se forskjellen, test ut denne koden og erstatt den Ved feil GoTo -1 med Err.Klar:
123456789101112131415161718192021 | Sub ErrExample ()Ved feil GoTo errHandler:"" Programdefinert "feilFeil (13)Avslutt SuberrHandler:'Fjern feilVed feil GoTo -1Ved feil GoTo errHandler2:"" Type mismatch "feilFeil (1034)Avslutt SuberrHandler2:Debug.Print Err.BeskrivelseSlutt Sub |
Vanligvis anbefaler jeg alltid å bruke Ved feil GoTo -1, med mindre du har en god grunn til å bruke Err.Klar i stedet.
VBA på feil MsgBox
Du vil kanskje også vise en meldingsboks ved feil. Dette eksemplet vil vise forskjellige meldingsbokser avhengig av hvor feilen oppstår:
12345678910111213141516171819202122232425262728 | Sub ErrorMessageEx ()Dim errMsg As StringVed feil GoTo errHandler'1. stadieerrMsg = "Det oppstod en feil under kopierings- og limfasen."'Err.Raise (11)'Trinn 2errMsg = "Det oppstod en feil under datavalideringsfasen."'Err.Raise (11)'Trinn 3errMsg = "Det oppstod en feil under P & L-Building og Copy-Over fasen."Err.Raise (11)'Fase 4errMsg = "Det oppstod en feil under forsøket på å logge importen på konfigurasjonssiden"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Slutt Sub |
Her vil du erstatte Err.Raise (11) med din faktiske kode.
VBA IsError
En annen måte å håndtere feil på er å teste dem med VBA IsError -funksjonen. IsError -funksjonen tester et uttrykk for feil, og returnerer TRUE eller FALSE hvis det oppstår en feil.
123 | Sub IsErrorEx ()MsgBox IsError (område ("a7"). Verdi)Slutt Sub |
Hvis feil VBA
Du kan også håndtere feil i VBA med Excel IfError -funksjonen. IfError -funksjonen må åpnes ved å bruke Arbeidsark Funksjonsklasse:
1234567 | Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Range ("a10"). Verdi, 0)MsgBox nSlutt Sub |
Dette sender ut verdien til område A10, hvis verdien er en feil, vil den ut 0 i stedet.
VBA -feiltyper
Kjøretidsfeil
Som nevnt over:
VBA -kjøretidsfeil er feil som oppstår under kjøring av kode. Eksempler på kjøretidsfeil inkluderer:
- Refererer til en ikke-eksisterende arbeidsbok, regneark eller annet objekt
- Ugyldige data eks. refererer til en Excel -celle som inneholder en feil
- Forsøk på å dele med null
Du kan "feilhåndtere" kjøretidsfeil ved å bruke metodene som er diskutert ovenfor.
Syntaksfeil
VBA -syntaksfeil er feil med kodeskriving. Eksempler på syntaksfeil inkluderer:
- Feilstaving
- Manglende eller feil tegnsetting
VBA Editor identifiserer mange syntaksfeil med rød utheving:
VBA Editor har også et alternativ til "Auto Syntax Check":
Når dette er merket, vil VBA Editor generere en meldingsboks som varsler deg om syntaksfeil etter at du har skrevet inn en kode:
Jeg personlig synes dette er ekstremt irriterende og deaktiverer funksjonen.
Kompiler feil
Før du prøver å kjøre en prosedyre, vil VBA "kompilere" prosedyren. Kompilering forvandler programmet fra kildekoden (som du kan se) til kjørbar form (du kan ikke se).
VBA -kompileringsfeil er feil som forhindrer at koden kompileres.
Et godt eksempel på en kompileringsfeil er en manglende variabeldeklarasjon:
Andre eksempler inkluderer:
- Til uten Neste
- Plukke ut uten Avslutt Velg
- Hvis uten Slutt om
- Ringer a fremgangsmåte som ikke eksisterer
Syntaksfeil (forrige seksjon) er et delsett av kompileringsfeil.
Debug> Kompiler
Kompileringsfeil vises når du prøver å kjøre en prosedyre. Men ideelt sett vil du identifisere kompileringsfeil før du prøver å kjøre prosedyren.
Du kan gjøre dette ved å sette sammen prosjektet på forhånd. For å gjøre det, gå til Debug> Kompiler VBA -prosjekt.
Kompilatoren vil "gå til" den første feilen. Når du har løst feilen, kompilerer du prosjektet på nytt. Gjenta til alle feilene er rettet.
Du kan fortelle at alle feil er fikset pga Kompiler VBA -prosjekt blir nedtonet:
OverFlow -feil
De VBA OverFlow -feil oppstår når du prøver å sette en verdi i en variabel som er for stor. For eksempel, Heltallsvariabler kan bare inneholde verdier mellom -32,768 til 32,768. Hvis du angir en større verdi, får du en overflytingsfeil:
I stedet bør du bruke Lang variabel for å lagre det større antallet.
Andre VBA -feilvilkår
VBA Catch Error
I motsetning til andre programmeringsspråk, er det i VBA ingen Fangeforklaring. Du kan imidlertid replikere en fangsterklæring ved å bruke Ved feil Fortsett neste og Hvis Err.Number 0 Da. Dette er dekket ovenfor i Feilhåndtering med Err.Number.
VBA Ignorer feil
For å ignorere feil i VBA, bruker du bare Ved feil Fortsett neste uttalelse:
1 | Ved feil Fortsett neste |
Som nevnt ovenfor, bør du imidlertid være forsiktig med å bruke denne erklæringen, siden den ikke fikser en feil, den ignorerer bare kodelinjen som inneholder feilen.
VBA Throw Error / Err.Raise
For å gjennom en feil i VBA, bruker du Err.Raise metode.
Denne kodelinjen vil øke Run-time error '13': Type feil samsvar:
1 | Err.Raise (13) |
VBA -feilfanging
VBA -feilfanging er bare et annet begrep for VBA -feilbehandling.
VBA -feilmelding
EN VBA -feilmelding ser slik ut:
Når du klikker på 'Debug', ser du kodelinjen som kaster feilen:
VBA -feilhåndtering i en løkke
Den beste måten å feile håndtere i en loop er ved å bruke Ved feil Fortsett neste sammen med Err.Nummer for å oppdage om det har oppstått en feil (Husk å bruke Err.Klar for å slette feilen etter hver hendelse).
Eksemplet nedenfor vil dele to tall (kolonne A med kolonne B) og sende resultatet til kolonne C. Hvis det er en feil, blir resultatet 0.
12345678910111213141516 | Del test ()Dim cell As RangeVed feil Fortsett nesteFor hver celle i området ("a1: a10")'Angi celleverdicell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Hvis Cell.Value er feil, er standard til 0Hvis Err.Number 0 Dacelle.Offset (0, 2) .Værdi = 0Err.KlarSlutt omNesteSlutt Sub |
VBA -feilhåndtering i tilgang
Alle eksemplene ovenfor fungerer nøyaktig det samme i Access VBA som i Excel VBA.
123456789101112131415161718 | Funksjon DelRecord (frm som skjema)'Denne funksjonen brukes til å slette en post i en tabell fra et skjemaVed feil GoTo endingMed frmHvis .NewRecord Da.UndoAvslutt funksjonSlutt omSlutt medMed frm.RecordsetClone.Bokmerke = frm.bokmerke.Slettfrm.KravSlutt medAvslutt funksjonslutt:SluttSluttfunksjon |