Når du skal håndtere fejl i Excel VBA, kan du bruge OnError-sætningen. Der er dog et par ting, du skal vide først. Du kan bruge On Error-sætningen på tre måder.
Syntaks |
Hvad det gør |
Ved fejl GoTo label |
Efter at have udført denne sætning, genoptager VBA udførelsen ved
sætningen efter den angivne etiket. Du skal inkludere et kolon
efter etiketten, så VBA genkender den som en etiket. |
Ved fejl GoTo 0 |
Efter at have udført denne sætning, genoptager VBA sin normale
fejlkontrolfunktion. Brug denne erklæring efter at have brugt en af de
andre On Error-sætninger, eller når du vil fjerne fejlhåndtering
i din procedure. |
Ved fejl Genoptag Næste |
Efter at have udført denne sætning ignorerer VBA simpelthen alle fejl
og genoptager udførelsen med den næste sætning. |
Genoptager efter en fejl
I nogle tilfælde vil du blot have, at rutinen afsluttes elegant, når der opstår en fejl. For eksempel kan du vise en meddelelse, der beskriver fejlen, og derefter afslutte proceduren. (Eksemplet med EnterSquareRoot5 vist tidligere bruger denne teknik.) I andre tilfælde vil du, hvis det er muligt, genoprette fejlen.
For at genoprette en fejl skal du bruge en CV-erklæring. Dette rydder fejltilstanden og giver dig mulighed for at fortsætte udførelsen et eller andet sted. Du kan bruge CV-erklæringen på tre måder.
Syntaks |
Hvad det gør |
Genoptag |
Udførelsen genoptages med den erklæring, der forårsagede fejlen. Brug
dette, hvis din fejlhåndteringskode løser problemet, og
det er okay at fortsætte. |
Genoptag næste |
Udførelsen genoptages med erklæringen umiddelbart efter
erklæringen, der forårsagede fejlen. Dette ignorerer i det væsentlige
fejlen. |
Genoptag etiket |
Udførelsen genoptages på den etiket, du angiver. |
Følgende eksempel bruger en CV-sætning, efter der opstår en fejl:
Sub EnterSquareRoot6()
Dim nummer som variant
Dæmp besked som streng
Dim Ans Som heltal
Prøv igen:
' Konfigurer fejlhåndtering
Ved fejl GoTo BadEntry
' Bed om en værdi
Num = InputBox(“Indtast en værdi”)
Hvis Num = ““ Afslut Sub
' Indsæt kvadratroden
ActiveCell.Value = Sqr(Num)
Afslut 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 indtaster en ikke-negativ værdi."
Msg = Msg & vbNewLine & vbNewLine & "Prøv igen?"
Ans = MsgBox(Msg, vbYesNo + vbCritical)
Hvis Ans = vbYes Så genoptag Prøv igen
Slut Sub
Denne procedure har en anden etiket: TryAgain. Hvis der opstår en fejl, fortsætter eksekveringen ved BadEntry-etiketten, og koden viser meddelelsen nedenfor. Hvis brugeren svarer ved at klikke på Ja, starter Resume-erklæringen, og udførelsen hopper tilbage til TryAgain-etiketten. Hvis brugeren klikker på Nej, afsluttes proceduren.
Hvis der opstår en fejl, kan brugeren beslutte, om han vil prøve igen.
Bemærk, at fejlmeddelelsen også indeholder fejlnummeret sammen med den "officielle" fejlbeskrivelse.
Genoptag-erklæringen rydder fejltilstanden, før du fortsætter. For at se dette skal du prøve at erstatte den næstsidste sætning i det foregående eksempel med følgende sætning:
Hvis Ans = vbYes Så gå til prøv igen
Koden virker ikke korrekt, hvis du bruger GoTo frem for Genoptag. Indtast et negativt tal for at demonstrere. Du får fejlmeddelelsen. Klik på Ja for at prøve igen, og indtast derefter et andet negativt tal. Denne anden fejl er ikke fanget, fordi den oprindelige fejltilstand ikke blev ryddet.
Fejlhåndtering i en nøddeskal
For at hjælpe dig med at holde hele denne fejlhåndteringsvirksomhed ved lige, er her en hurtig og beskidt oversigt. En blok med fejlhåndteringskode har følgende egenskaber:
-
Den begynder umiddelbart efter den etiket, der er angivet i On Error-sætningen.
-
Den bør kun nås af din makro, hvis der opstår en fejl. Det betyder, at du skal bruge en sætning som Exit Sub eller Exit Function umiddelbart før etiketten.
-
Det kan kræve en CV-erklæring. Hvis du vælger ikke at afbryde proceduren, når der opstår en fejl, skal du udføre en Resume-sætning, før du vender tilbage til hovedkoden.
At vide, hvornår man skal ignorere fejl
I nogle tilfælde er det helt i orden at ignorere fejl. Det er, når erklæringen On Error Resume Next kommer i spil.
Følgende eksempel går gennem hver celle i det valgte område og konverterer værdien til dens kvadratrod. Denne procedure genererer en fejlmeddelelse, hvis en celle i markeringen indeholder et negativt tal eller tekst:
Sub SelectionSqrt()
Dæmp celle som område
Hvis TypeName(Selection) <> "Range" Afslut Sub
For hver celle i udvalgt
celle.Value = Sqr(cell.Value)
Næste celle
Slut Sub
I dette tilfælde vil du måske blot springe en celle over, der indeholder en værdi, du ikke kan konvertere til en kvadratrod. Du kan oprette alle mulige fejlkontrolfunktioner ved at bruge If-Then-strukturer, men du kan udtænke en bedre (og enklere) løsning ved blot at ignorere de fejl, der opstår.
Følgende rutine opnår dette ved at bruge erklæringen Ved fejl ved genoptagelse af næste:
Sub SelectionSqrt()
Dæmp celle som område
Hvis TypeName(Selection) <> "Range" Afslut Sub
Ved fejl Genoptag Næste
For hver celle i udvalgt
celle.Value = Sqr(cell.Value)
Næste celle
Slut Sub
Generelt kan du bruge en On Error Resume Next-erklæring, hvis du anser fejlene for at være harmløse eller uden betydning for din opgave.