Hvordan bruke OnError erklæringen i Excel 2 016 VBA

Når du trenger for å håndtere feil i Excel VBA, kan du bruke OnError uttalelse. Det er imidlertid et par ting du trenger å vite først. Du kan bruke ved feil uttalelse på tre måter.
SyntaxWhat Det DoesOn Error GoTo etikett
Etter at denne uttalelsen, gjenopptas VBA henrettelse ved thestatement etter den angitte etiketten. Du må vedlegge en colonafter etiketten slik at VBA gjenkjenner den som en label.On Error GoTo 0After at denne uttalelsen, VBA fortsetter sin normalerror-sjekker atferd. Bruk denne uttalelsen etter å ha brukt en av theother På Feil uttalelser eller når du ønsker å fjerne feil handlingin din procedure.On Error Resume NextAfter at denne uttalelsen, ignorerer VBA rett og slett alt errorsand fortsetter kjøringen med neste setning.
Fortsette etter en feil

I noen tilfeller, du bare ønsker rutinen til å ende grasiøst når det oppstår en feil. For eksempel kan du vise en melding som beskriver feilen, og deretter gå ut av prosedyren. (The EnterSquareRoot5 eksempel vist tidligere bruker denne teknikken.) I andre tilfeller vil du gjenopprette etter feilen, hvis det er mulig.

For å utbedre en feil, må du bruke en CV uttalelse. Dette fjerner feilen og lar deg fortsette henrettelse på noen sted. Du kan bruke Resume uttalelse på tre måter.
SyntaxWhat Det DoesResumeExecution fortsetter med påstanden som forårsaket feilen. Usethis hvis feilhåndtering kode korrigerer problemet federasjon ’ s greit å continue.Resume NextExecution fortsetter med setningen umiddelbart etter thestatement som forårsaket feilen. Dette ignorerer hovedsak theerror.Resume etikett
Execution fortsetter på etikett
du angi

​​Følgende eksempel bruker en CV uttalelse etter det oppstår en feil.
Sub EnterSquareRoot6 () Dim Num Som Variant Dim mld As String Dim Ans Som IntegerTryAgain: 'Sett opp feilhåndtering On Error GoTo BadEntry' Spør etter en verdi num = InputBox ("Skriv inn en verdi") Hvis num = "" Then Exit Sub 'Sett kvadratroten ActiveCell .Value = Sqr (Num) Exit SubBadEntry: Msg = err.number & ":" &Amp; Feil (err.number) Msg = Bes & vbNewLine & vbNewLine Msg = Bes & "Pass på at et utvalg er valgt," Msg = Bes & "Arket ikke er beskyttet," Msg = Bes & "Og du angir et positivt verdi." Msg = Bes & vbNewLine & vbNewLine & "? Prøv igjen" Ans = MsgBox (MSG, vbYesNo + vbCritical) Hvis Ans = vbYes Så Resume TryAgainEnd Sub

Denne prosedyren har en annen label: TryAgain. Hvis det oppstår en feil, fortsetter kjøringen på BadEntry etiketten, og koden viser meldingen nedenfor. Hvis brukeren svarer ved å klikke Ja, spark Resume uttalelse i, og gjennomføring hopper tilbake til TryAgain etiketten. Hvis brukeren klikker Nei, avslutter prosedyren.
Hvis det oppstår en feil, kan brukeren bestemme om du vil prøve på nytt.

Legg merke til at feilmeldingen inneholder også feilnummeret, sammen med den "offisielle" feil beskrivelse.

Fortsett uttalelsen fjerner feilen før du fortsetter. For å se dette, kan du prøve å erstatte følgende uttalelse for den nest siste setningen i det foregående eksempel:
Hvis Ans = vbYes Så GoTo TryAgain

Koden fungerer ikke riktig hvis du bruker GoTo heller enn Resume. For å demonstrere, legge inn et negativt tall. Du får feilteksten. Klikk Ja for å prøve igjen og deretter inn en annen
negativt tall. Denne andre feilen er ikke fanget fordi den opprinnelige feilen ikke ble tømt.

Feilhåndtering i et nøtteskall

For å hjelpe deg med å holde alt dette feilhåndtering rett, her er en rask-og- skitne oppsummering. En blokk med feilhåndtering kode har følgende egenskaper:.

  • Det begynner umiddelbart etter etiketten spesifisert i On Error uttalelse

    Det skal nås med makroen bare hvis en feil oppstår. Dette betyr at du må bruke en uttalelse som Exit Sub eller Exit Function umiddelbart før etiketten.
  • Det kan kreve en CV uttalelse. Hvis du velger å ikke avbryte prosedyren når det oppstår en feil, må du utføre en CV uttalelse før retur til hovedkoden.

    Å vite når man skal ignorere feil

    I noen tilfeller er det helt greit å ignorere feil. Det er da On Error Resume Neste Uttalelsen kommer inn i bildet.

    Følgende eksempel looper gjennom hver celle i det valgte området og konverterer verdien til sin kvadratroten. Denne prosedyren genererer en feilmelding hvis en celle i utvalget inneholder et negativt tall eller tekst:
    Sub SelectionSqrt () Dim celle As Range Hvis Typename (Utvalg) & lt; & gt; "Range" Then Exit Sub For Hver celle i utvalg cell.Value = Sqr (cell.Value) Neste cellEnd Sub

    I dette tilfellet kan det være lurt å bare hoppe over en celle som inneholder en verdi du kan ikke konvertere til en kvadratroten. Du kan lage alle slags feilsjekking evner ved hjelp av if-then strukturer, men du kan tenke ut en bedre (og enklere) løsning ved bare ignorerer feilene som oppstår.

    Følgende rutine oppnår dette ved hjelp av On Error Resume Next uttalelse:
    Sub SelectionSqrt () Dim celle As Range Hvis Typename (Utvalg) & lt; & gt; "Range" Then Exit Sub On Error Resume Next For Hver celle i utvalg cell.Value = Sqr (cell.Value) Neste cellEnd Sub

    Vanligvis kan du bruke en On Error Resume Next setningen hvis du tenker på de feil å være ufarlig eller uviktige til din oppgave. Anmeldelser