Feilbehandlere lar deg spesifisere hva som skjer når det oppstår en feil mens Excel-makrokoden kjører. Feilbehandlere er linjer som ligner på følgende:
Ved feil GoTo MyError
Uten feilbehandlere vil enhver feil som oppstår i koden din be Excel om å aktivere en mindre enn nyttig feilmelding som vanligvis ikke tydelig formidler hva som skjedde. Ved hjelp av feilbehandlere kan du imidlertid velge å ignorere feilen eller avslutte koden med din egen melding til brukeren.
Det er tre typer On Error-setninger:
-
Ved feil GoTo SomeLabel: Koden hopper til den angitte etiketten.
-
On Error Resume Next: Feilen ignoreres og koden gjenopptas.
-
Ved feil GoTo 0: VBA tilbakestiller til normal feilkontrolloppførsel.
Ved feil GoTo SomeLabel
Noen ganger betyr en feil i koden at du må avslutte prosedyren elegant og gi brukerne en klar melding. I disse situasjonene kan du bruke On Error GoTo-setningen til å fortelle Excel å hoppe til en bestemt linje med kode.
For eksempel, i den følgende lille kodebiten ber du Excel om å dele verdien i celle A1 med verdien i celle A2, og deretter plassere svaret i celle A3. Lett. Hva kan gå galt?
Sub Makro1()
Område("A3"). Verdi = Område("A1"). Verdi / område("A2"). Verdi
End Sub
Det viser seg at to store ting kan gå galt. Hvis celle A2 inneholder 0, får du en del på 0 feil. Hvis celle A2 inneholder en ikke-numerisk verdi, får du en typefeil.
For å unngå en ekkel feilmelding, kan du fortelle Excel at Ved feil vil du at kodekjøringen skal hoppe til etiketten som heter MyExit.
I den følgende koden etterfølges MyExit-etiketten av en melding til brukeren som gir vennlige råd i stedet for en ekkel feilmelding. Legg også merke til Exit Sub-linjen før MyExit-etiketten, som sikrer at koden ganske enkelt avsluttes hvis det ikke oppstår noen feil:
Sub Makro1()
Ved feil GoTo MyExit
Område("A3"). Verdi = Område("A1"). Verdi / område("A2"). Verdi
Avslutt Sub
MyExit:
MsgBox "Vennligst bruk gyldige tall som ikke er null"
End Sub
Ved feil på Fortsett neste
Noen ganger vil du at Excel skal ignorere en feil og ganske enkelt fortsette å kjøre koden. I disse situasjonene kan du bruke setningen Ved feil ved gjenoppta neste.
For eksempel er følgende kodebit ment å slette en fil kalt GhostFile.exe fra C:Temp-katalogen. Etter at filen er slettet, forteller en hyggelig meldingsboks brukeren at filen er borte:
Sub Makro1()
Drep "C:TempGhostFile.exe"
MsgBox "Filen har blitt slettet."
End Sub
Koden fungerer utmerket hvis det faktisk er en fil å slette. Men hvis filen som heter GhostFile.exe av en eller annen grunn ikke eksisterer i C:Temp-stasjonen, oppstår en feil.
I dette tilfellet bryr du deg ikke om filen ikke er der fordi du skulle slette den uansett. Så du kan ganske enkelt ignorere feilen og gå videre med koden.
Ved å bruke On Error Resume Next-setningen, kjører koden sin kurs uansett om målfilen eksisterer eller ikke:
Sub Makro1()
Ved feil på Fortsett neste
Drep "C:TempGhostFile.exe"
MsgBox "Filen har blitt slettet."
End Sub
Ved feil GoTo 0
Når du bruker visse feilsetninger, kan det være nødvendig å tilbakestille feilkontrolloppførselen til VBA. For å forstå hva dette betyr, ta en titt på neste eksempel.
Her vil du først slette en fil kalt GhostFile.exe fra C:Temp-katalogen. For å unngå feil som kan stamme fra det faktum at målfilen ikke eksisterer, bruker du On Error Resume Next-setningen. Etter det prøver du å gjøre litt suspekt matematikk ved å dele 100/Mike:
Sub Makro1()
Ved feil på Fortsett neste
Drep "C:TempGhostFile.exe"
Range("A3"). Verdi = 100 / "Mike"
End Sub
Å kjøre denne kodebiten burde generere en feil på grunn av uklar matematikk, men det gjør det ikke. Hvorfor? Fordi den siste instruksjonen du ga til koden var On Error Resume Next. Enhver feil som oppstår etter den linjen blir effektivt ignorert.
For å løse dette problemet kan du bruke On Error GoTo 0-setningen for å gjenoppta normal feilkontrolloppførsel:
Sub Makro1()
Ved feil på Fortsett neste
Drep "C:TempGhostFile.exe"
Ved feil GoTo 0
Range("A3"). Verdi = 100 / "Mike"
End Sub
Denne koden vil ignorere feil inntil On Error GoTo 0-setningen. Etter den uttalelsen går koden tilbake til normal feilkontroll og utløser den forventede feilen som stammer fra den uklare matematikken.