VBA On Error - Feilhåndtering av beste praksis

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

Se 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

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave