Når du trenger å håndtere feil i Excel VBA, kan du bruke OnError-setningen. Det er imidlertid et par ting du må vite først. Du kan bruke On Error-setningen på tre måter.
Syntaks |
Hva det gjør |
Ved feil GoTo- etikett |
Etter å ha utført denne setningen, gjenopptar VBA kjøringen ved
setningen etter den angitte etiketten. Du må inkludere et kolon
etter etiketten slik at VBA gjenkjenner den som en etikett. |
Ved feil GoTo 0 |
Etter å ha utført denne setningen, gjenopptar VBA sin normale
feilkontrolloppførsel. Bruk denne setningen etter å ha brukt en av de
andre On Error-setningene eller når du vil fjerne feilhåndtering
i prosedyren. |
Ved feil på Fortsett neste |
Etter å ha utført denne setningen, ignorerer VBA ganske enkelt alle feil
og gjenopptar kjøringen med neste setning. |
Gjenopptar etter en feil
I noen tilfeller vil du ganske enkelt at rutinen skal avsluttes elegant når det oppstår en feil. Du kan for eksempel vise en melding som beskriver feilen og deretter avslutte prosedyren. (EnterSquareRoot5-eksemplet vist tidligere bruker denne teknikken.) I andre tilfeller ønsker du å gjenopprette feilen, hvis mulig.
For å gjenopprette fra en feil, må du bruke en CV-erklæring. Dette fjerner feiltilstanden og lar deg fortsette kjøringen på et sted. Du kan bruke CV-erklæringen på tre måter.
Syntaks |
Hva det gjør |
Gjenoppta |
Utførelsen fortsetter med setningen som forårsaket feilen. Bruk
denne hvis feilhåndteringskoden din løser problemet og
det er greit å fortsette. |
Fortsett neste |
Utførelsen fortsetter med setningen umiddelbart etter
setningen som forårsaket feilen. Dette ignorerer i hovedsak
feilen. |
Fortsett- etikett |
Kjøringen fortsetter på etiketten du angir. |
Følgende eksempel bruker en CV-setning etter at det oppstår en feil:
Sub EnterSquareRoot6()
Dim nummer som variant
Dim melding som streng
Dim Ans As Heltall
Prøv igjen:
' Sett opp feilhåndtering
Ved feil GoTo BadEntry
' Spør om en verdi
Num = InputBox(“Skriv inn en verdi”)
Hvis Num = ““ Avslutt Sub
' Sett inn kvadratroten
ActiveCell.Value = Sqr(tall)
Avslutt Sub
BadEntry:
Msg = Err.Number & “: “ & Error(Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Msg & "Sørg for at et område er valgt,"
Msg = Msg & "arket er ikke beskyttet",
Msg = Msg & "og du angir en ikke-negativ verdi."
Msg = Msg & vbNewLine & vbNewLine & "Prøve igjen?"
Ans = MsgBox(Msg, vbYesNo + vbCritical)
Hvis Ans = vbYes, gjenoppta Prøv igjen
End Sub
Denne prosedyren har en annen etikett: TryAgain. Hvis det oppstår en feil, fortsetter kjøringen ved BadEntry-etiketten, og koden viser meldingen nedenfor. Hvis brukeren svarer ved å klikke Ja, starter Resume-setningen, og utførelsen hopper tilbake til TryAgain-etiketten. Hvis brukeren klikker Nei, avsluttes prosedyren.
Hvis det oppstår en feil, kan brukeren bestemme om han vil prøve igjen.
Legg merke til at feilmeldingen også inkluderer feilnummeret, sammen med den "offisielle" feilbeskrivelsen.
Fortsett-setningen fjerner feiltilstanden før du fortsetter. For å se dette, prøv å erstatte den nest siste setningen i det foregående eksempelet med følgende setning:
Hvis Ans = vbYes Gå til Prøv igjen
Koden fungerer ikke riktig hvis du bruker GoTo i stedet for Gjenoppta. For å demonstrere, skriv inn et negativt tall. Du får feilmeldingen. Klikk på Ja for å prøve igjen og skriv inn et annet negativt tall. Denne andre feilen er ikke fanget fordi den opprinnelige feiltilstanden ikke ble fjernet.
Feilhåndtering i et nøtteskall
For å hjelpe deg å holde all denne feilhåndteringsvirksomheten rett, her er en rask og skitten oppsummering. En blokk med feilhåndteringskode har følgende egenskaper:
-
Den begynner umiddelbart etter etiketten som er spesifisert i On Error-setningen.
-
Makroen din skal bare nås hvis det oppstår en feil. Dette betyr at du må bruke en setning som Exit Sub eller Exit Function rett før etiketten.
-
Det kan kreve en CV-erklæring. Hvis du velger å ikke avbryte prosedyren når det oppstår en feil, må du utføre en Resume-setning før du går tilbake til hovedkoden.
Å vite når du skal ignorere feil
I noen tilfeller er det helt greit å ignorere feil. Det er da On Error Resume Next-erklæringen kommer inn.
Følgende eksempel går gjennom hver celle i det valgte området og konverterer verdien til kvadratroten. Denne prosedyren genererer en feilmelding hvis en celle i utvalget inneholder et negativt tall eller tekst:
Sub SelectionSqrt()
Dim celle som område
Hvis TypeName(Selection) <> "Range" Avslutt Sub
For hver celle i utvalg
celle.Value = Sqr(cell.Value)
Neste celle
End Sub
I dette tilfellet vil du kanskje bare hoppe over en celle som inneholder en verdi du ikke kan konvertere til en kvadratrot. Du kan lage alle slags feilkontrollfunksjoner ved å bruke If-Then-strukturer, men du kan tenke ut en bedre (og enklere) løsning ved å ignorere feilene som oppstår.
Følgende rutine oppnår dette ved å bruke setningen On Error Resume Next:
Sub SelectionSqrt()
Dim celle som område
Hvis TypeName(Selection) <> "Range" Avslutt Sub
Ved feil på Fortsett neste
For hver celle i utvalg
celle.Value = Sqr(cell.Value)
Neste celle
End Sub
Generelt kan du bruke en On Error Resume Next-erklæring hvis du anser feilene for å være ufarlige eller uvesentlige for oppgaven din.