Excel VBA fejlhåndtering - alt hvad du behøver at vide!

Uanset hvor erfaren du er med VBA -kodning, vil fejl altid være en del af det.

Forskellen mellem en nybegynder og en ekspert VBA -programmør er, at ekspertprogrammererne ved, hvordan de effektivt håndterer og bruger fejl.

I denne vejledning viser jeg dig forskellige måder, du kan bruge til effektivt at håndtere fejl i Excel VBA.

Inden vi går ind i VBA -fejlhåndtering, lad os først forstå de forskellige typer fejl, du sandsynligvis vil støde på, når du programmerer i Excel VBA.

Typer af VBA -fejl i Excel

Der er fire typer fejl i Excel VBA:

  1. Syntaksfejl
  2. Kompileringsfejl
  3. Kørselsfejl
  4. Logiske fejl

Lad os hurtigt forstå, hvad disse fejl er, og hvornår du sandsynligvis vil støde på disse.

Syntaks fejl

En syntaksfejl, som navnet antyder, opstår, når VBA finder noget galt med syntaksen i koden.

For eksempel, hvis du glemmer en del af sætningen/syntaksen, der er nødvendig, vil du se kompileringsfejlen.

I nedenstående kode, så snart jeg trykker på enter efter den anden linje, ser jeg en kompileringsfejl. Dette er fordi IF -erklæring skal have 'Derefter'Kommando, som mangler i nedenstående kode.

Bemærk: Når du skriver en kode i Excel VBA, tjekker den for hver sætning, så snart du trykker på enter. Hvis VBA finder noget mangler i syntaksen, viser det øjeblikkeligt en meddelelse med noget tekst, der kan hjælpe dig med at forstå den manglende del.

For at sikre, at du ser syntaksfejlen, når der mangler noget, skal du sørge for, at Autosyntax -kontrol er aktiveret. For at gøre dette skal du klikke på 'Værktøjer' og derefter klikke på 'Indstillinger'. I dialogboksen Indstillinger skal du sørge for, at indstillingen ‘Automatisk syntakscheck’ er aktiveret.

Hvis indstillingen ‘Autosyntaksekontrol’ er deaktiveret, vil VBA stadig markere linjen med syntaksfejlen i rødt, men den viser ikke fejldialogboksen.

Kompileringsfejl

Kompileringsfejl opstår, når der mangler noget, der er nødvendigt for at koden skal køre.

For eksempel i nedenstående kode, så snart jeg prøver at køre koden, viser den følgende fejl. Dette sker, da jeg har brugt IF Then -sætningen uden at lukke den med den obligatoriske 'End If'.

En syntaksfejl er også en type kompileringsfejl. Der opstår en syntaksfejl, så snart du trykker på enter, og VBA identificerer, at der mangler noget. En kompilationsfejl kan også forekomme, når VBA ikke finder noget mangler, mens koden indtastes, men den gør det, når koden kompileres eller udføres.

VBA kontrollerer hver linje, mens du skriver koden og fremhæver syntaksfejlen, så snart linjen er forkert, og du trykker på enter. Kompileringsfejl på den anden side identificeres kun, når hele koden analyseres af VBA.

Nedenfor er nogle scenarier, hvor du støder på kompileringsfejlen:

  1. Brug af en IF -erklæring uden slutningen IF
  2. Brug af For -sætning med Næste
  3. Brug af Select -sætning uden brug af End Select
  4. Deklarerer ikke variablen (dette virker kun, når Option Explicit er aktiveret)
  5. Opkald til en sub/funktion, der ikke findes (eller med forkerte parametre)
Bemærk om 'Mulighed eksplicit': Når du tilføjer 'Option Explicit', skal du deklarere alle variablerne, før koden køres. Hvis der er en variabel, der ikke er blevet deklareret, viser VBA en fejl. Dette er en god praksis, da det viser en fejl, hvis du har en forkert stavet variabel. Du kan læse mere om Option Explicit her.

Kørselsfejl

Kørselsfejl er dem, der opstår, når koden kører.

Kørselsfejl vil kun forekomme, når alle syntaks- og kompileringsfejl bliver taget hånd om.

For eksempel, hvis du kører kode, der skal åbne en Excel -projektmappe, men denne projektmappe ikke er tilgængelig (enten slettet eller navnet ændret), vil din kode give dig en runtime -fejl.

Når der opstår en runtime -fejl, stopper den koden og viser dig dialogboksen med fejl.

Meddelelsen i dialogboksen Run-time error er lidt mere nyttig. Det forsøger at forklare problemet, der kan hjælpe dig med at rette det.

Hvis du klikker på knappen Debug, fremhæver den den del af koden, der fører til fejlen.

Hvis du har rettet fejlen, kan du klikke på knappen Kør i værktøjslinjen (eller trykke på F5) for at fortsætte med at køre koden, hvor den forlod.

Eller du kan også klikke på knappen Afslut for at komme ud af koden.

Vigtig: Hvis du klikker på knappen Afslut i dialogboksen, stopper den koden ved den linje, hvor der findes. Imidlertid ville alle kodelinjer før det være blevet eksekveret.

Logiske fejl

Logiske fejl ville ikke få din kode til at stoppe, men kan føre til forkerte resultater. Disse kan også være de vanskeligste typer fejl at fejlfinde.

Disse fejl fremhæves ikke af kompilatoren og skal håndteres manuelt.

Et eksempel på logisk fejl (som jeg ofte står fast i) er at løbe ind i en endeløs sløjfe.

Et andet eksempel kan være, når det giver et forkert resultat. For eksempel kan du ende med at bruge en forkert variabel i koden eller tilføje to variabler, hvor den ene er forkert.

Der er et par måder, jeg bruger til at håndtere logiske fejl:

  1. Indsæt meddelelsesboks et eller andet sted i koden, og fremhæv værdier/data, der kan hjælpe med at forstå, om alt foregår som forventet.
  2. I stedet for at køre koden på én gang, skal du gå gennem hver linje en efter en. For at gøre dette skal du klikke et vilkårligt sted i koden og trykke på F8. du vil bemærke, at hver gang du trykker på F8, bliver en linje udført. Dette giver dig mulighed for at gå igennem koden en linje ad gangen og identificere de logiske fejl.

Brug af fejlfinding til at finde kompilerings-/syntaksfejl

Når du er færdig med koden, er det en god praksis først at kompilere den, før du kører.

For at kompilere en kode skal du klikke på indstillingen Debug i værktøjslinjen og klikke på Compile VBAProject.

Når du kompilerer et VBA -projekt, går det igennem koden og identificerer fejl (hvis nogen).

Hvis den finder en fejl, viser den dig en dialogboks med fejlen. Den finder fejl en efter en. Så hvis den finder en fejl, og du har rettet den, skal du køre kompilering igen for at finde andre fejl (hvis der er).

Når din kode er fri for fejl, bliver indstillingen Compile VBAProject gråtonet.

Bemærk, at Compiling kun finder 'Syntax' -fejl og' Compile 'fejl. Det finder IKKE fejl i løbetid.

Når du skriver VBA -kode, vil du ikke have, at fejlene dukker op. For at undgå dette er der mange metoder til fejlhåndtering, du kan bruge.

I de næste par afsnit af denne artikel vil jeg dække de metoder, du kan bruge til håndtering af VBA -fejl i Excel.

Konfigurer fejlindstillinger (håndteret mod ubehandlede fejl)

Inden du begynder at arbejde med din kode, skal du søge efter en indstilling i Excel VBA.

Gå til VBA -værktøjslinjen, klik på Værktøjer, og klik derefter på Indstillinger.

I dialogboksen Indstillinger skal du klikke på fanen Generelt og sørge for, at der i feltet 'Fejlopsamling' er markeret 'Afbryd ved ubehandlede fejl'.

Lad mig forklare de tre muligheder:

  1. Afbryd alle fejl: Dette stopper din kode på alle typer fejl, selv når du har brugt teknikkerne til at håndtere disse fejl.
  2. Modul med indbrud i klassen: Dette stopper din kode på alle ubehandlede fejl, og på samme tid, hvis du bruger objekter som brugerformularer, vil den også bryde inden for disse objekter og fremhæve den nøjagtige linje, der forårsager fejlen.
  3. Afbryd ubehandlede fejl: Dette stopper kun din kode for de fejl, der ikke håndteres. Dette er standardindstillingen, da den sikrer, at ubehandlede fejl bliver gjort opmærksom på dig. Hvis du bruger objekter som brugerformularer, fremhæver dette ikke den linje, der forårsager fejlen i objektet, men fremhæver kun den linje, der refererer til det pågældende objekt.
Bemærk: Hvis du arbejder med objekter som brugerformularer, kan du ændre denne indstilling til 'Break on Class Modules'. Forskellen mellem #2 og #3 er, at når du bruger Break in Class Module, tager det dig til den specifikke linje i objektet, der forårsager fejlen. Du kan også vælge at gå med dette i stedet for 'Break on Unhandled Errors'.

Så i en nøddeskal - hvis du lige er begyndt med Excel VBA, skal du sikre dig, at 'Break on Unhandled Errors' er markeret.

VBA -fejlhåndtering med 'On Error' -erklæringer

Når din kode støder på en fejl, er der et par ting, du kan gøre:

  1. Ignorer fejlen, og lad koden fortsætte
  2. Hav en fejlhåndteringskode på plads, og kør den, når der opstår en fejl

Begge disse fejlhåndteringsmetoder sikrer, at slutbrugeren ikke kommer til at se en fejl.

Der er et par 'On Error' -udsagn, som du kan bruge til at få disse udført.

Ved fejl Genoptag næste

Når du bruger ‘On Error Resume Next’ i din kode, ignoreres enhver fejl, og koden fortsætter med at køre.

Denne fejlhåndteringsmetode bruges ret ofte, men du skal være forsigtig, når du bruger den. Da den helt ignorerer enhver fejl, der måtte opstå, er du muligvis ikke i stand til at identificere de fejl, der skal rettes.

Hvis nedenstående kode f.eks. Køres, returnerer den en fejl.

Sub AssignValues ​​() x = 20 /4 y = 30 /0 End Sub

Dette sker, fordi du ikke kan dividere et tal med nul.

Men hvis jeg bruger sætningen 'On Error Resume Next' i denne kode (som vist nedenfor), ignorerer den fejlen, og jeg ved ikke, at der er et problem, der skal rettes.

Sub AssignValues ​​() Ved fejl Genoptag Næste x = 20 /4 y = 30 /0 Afslut Sub

On Error Resume Next bør kun bruges, når du klart kender den slags fejl, din VBA -kode forventes at kaste, og det er i orden at ignorere det.

For eksempel er nedenfor VBA -hændelseskoden, der øjeblikkeligt ville tilføje dato- og tidsværdien i celle A1 i et nyligt indsat ark (denne kode tilføjes i regnearket og ikke i et modul).

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Nu, "dd-mmm-åååå hh: mm: ss") End Sub

Selvom dette fungerer godt i de fleste tilfælde, viser det en fejl, hvis jeg tilføjer et diagramark i stedet for et regneark. Da et diagramark ikke har celler, udsender koden en fejl.

Så hvis jeg bruger sætningen 'On Error Resume Next' i denne kode, fungerer det som forventet med regneark og gør ingenting med diagramark.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Nu, "dd-mmm-åååå hh: mm: ss") Afslut Sub

Bemærk: Ved fejl Genoptag Næste erklæring bruges bedst, når du ved, hvilken slags fejl du sandsynligvis vil støde på. Og hvis du synes, det er sikkert at ignorere disse fejl, kan du bruge det.

Du kan tage denne kode til det næste niveau ved at analysere, om der var en fejl, og vise en relevant meddelelse til den.

Nedenstående kode viser en meddelelsesboks, der informerer brugeren om, at der ikke er indsat et regneark.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Nu, "dd-mmm-åååå hh: mm: ss") Hvis Err.Number 0 Så ligner MsgBox "dig indsat et diagramark "& vbCrLf &" Error - "& Err.Description End If End Sub

'Err.Number' bruges til at få fejlnummeret, og 'Err.Description' bruges til at få fejlbeskrivelsen. Disse vil blive dækket senere i denne vejledning.

Ved fejl GoTo 0

'On Error GoTo 0' stopper koden på den linje, der forårsager fejlen, og viser en meddelelsesboks, der beskriver fejlen.

Enkelt sagt muliggør den standard fejlkontroladfærd og viser standardfejlmeddelelsen.

Så hvorfor overhovedet bruge det?

Normalt behøver du ikke bruge 'On Error Goto 0', men det kan være nyttigt, når du bruger det sammen med 'On Error Resume Next'

Lad mig forklare!

Nedenstående kode ville markere alle de tomme celler i markeringen.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks) .Vælg End Sub

Men det ville vise en fejl, når der ikke er tomme celler i de valgte celler.

Så for at undgå at vise fejlen kan du bruge On Error Resume next '

Nu vil det også vise enhver fejl, når du kører nedenstående kode:

Sub SelectFormulaCells () Ved fejl Genoptag næste valg.SpecialCells (xlCellTypeBlanks) .Vælg End Sub

Så langt så godt!

Problemet opstår, når der er en del af koden, hvor der kan opstå fejl, og da du bruger 'On Error Resume Next', ville koden simpelthen ignorere den og gå til den næste linje.

I nedenstående kode ville der f.eks. Ikke være nogen fejlmeddelelse:

Sub SelectFormulaCells () Ved fejl Genoptag Næste Selection.SpecialCells (xlCellTypeBlanks) .Vælg '… mere kode, der kan indeholde fejl End Sub

I ovenstående kode er der to steder, hvor der kan opstå en fejl. Det første sted er, hvor vi markerer alle tomme celler (ved hjælp af Selection.SpecialCells), og det andet er i den resterende kode.

Selvom den første fejl forventes, er enhver fejl efter det ikke.

Det er her On Error Goto 0 kommer til undsætning.

Når du bruger den, nulstiller du fejlindstillingen til standard, hvor den begynder at vise fejl, når den støder på den.

For eksempel i nedenstående kode ville der ikke være nogen fejl, hvis der ikke er tomme celler, men der ville være en fejlmeddelelse på grund af '10/0 ′

Sub SelectFormulaCells () Ved fejl Genoptag Næste Selection.SpecialCells (xlCellTypeBlanks) .Vælg på Error GoTo 0 '… mere kode, der kan indeholde fejl End Sub

Ved fejl Goto [Label]

Ovenstående to metoder - 'On Error Resume Next' og 'On Error Goto 0' - giver os ikke mulighed for virkelig at håndtere fejlen. Den ene får koden til at ignorere fejlen, og den anden genoptager fejlkontrol.

On Error Go [Label] er en måde, hvorpå du kan angive, hvad du vil gøre, hvis din kode har en fejl.

Nedenfor er kodestrukturen, der bruger denne fejlhåndterer:

Subtest () På fejl GoTo Label: X = 10 /0 'denne linje forårsager en fejl' …. din resterende kode går her Afslut undermærkat: 'kode for at håndtere fejlen Afslut Sub

Bemærk, at før fejlen ved håndtering af 'Label' er der en Exit Sub. Dette sikrer, at hvis der ikke er nogen fejl, forlades suben, og 'Label' -koden udføres ikke. Hvis du ikke bruger Exit Sub, vil den altid udføre 'Label' -koden.

I eksempelkoden herunder, når der opstår en fejl, springer koden og udfører koden i behandlingsafsnittet (og viser en meddelelsesboks).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Der ser ud til at være en fejl" & vbCrLf & Err.Description End Sub

Bemærk, at når der opstår en fejl, har koden allerede kørt og eksekveret linjerne før den linje, der forårsager fejlen. I eksemplet ovenfor angiver koden værdien af ​​X som 12, men da fejlen opstår i den næste linje, angiver den ikke værdierne for Y og Z.

Når koden hopper til fejlbehandlingskoden (ErrMsg i dette eksempel), vil den fortsætte med at udføre alle linjerne i og under fejlhåndtererkoden og afslutte suben.

Ved fejl Gå til -1

Denne er lidt kompliceret, og i de fleste tilfælde er det usandsynligt, at du vil bruge denne.

Men jeg vil stadig dække dette, da jeg har stået over for en situation, hvor dette var nødvendigt (ignorer gerne og spring til det næste afsnit, hvis du kun leder efter det grundlæggende).

Inden jeg går ind i mekanikken i det, lad mig prøve at forklare, hvor det kan være nyttigt.

Antag, at du har en kode, hvor der opstår en fejl. Men alt er godt, da du har en fejlbehandler på plads. Men hvad sker der, når der er en anden fejl i fejlhåndtererkoden (ja … lidt som startfilmen).

I et sådant tilfælde kan du ikke bruge den anden handler, da den første fejl ikke er blevet ryddet. Så mens du har håndteret den første fejl, eksisterer den i VBAs hukommelse stadig. Og VBA -hukommelsen har kun plads til en fejl - ikke to eller flere end det.

I dette scenario kan du bruge On Error Goto -1.

Det rydder fejlen og frigør VBA -hukommelse til at håndtere den næste fejl.

Nok snak!

Lad mig forklare nu ved hjælp af eksempler.

Antag, at jeg har nedenstående kode. Dette vil give en fejl, da der er division med nul.

Underfejlhåndterer () X = 12 Y = 20 /0 Z = 30 End Sub

Så for at håndtere det bruger jeg en fejlbehandlingskode (med navnet ErrMsg) som vist herunder:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Der ser ud til at være en fejl" & vbCrLf & Err.Description End Sub

Alt er godt igen nu. Så snart fejlen opstår, bruges fejlbehandleren og viser en meddelelsesboks som vist nedenfor.

Nu udvider jeg koden, så jeg har mere kode i eller efter fejlbehandleren.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Der ser ud til at være en fejl" & vbCrLf & Err.Description A = 10 /2 B = 35 /0 End Sub

Da den første fejl er blevet håndteret, men den anden ikke har været, ser jeg igen en fejl som vist nedenfor.

Stadig alt godt. Koden opfører sig på den måde, vi havde forventet.

Så for at håndtere den anden fejl, bruger jeg en anden fejlbehandler (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Det ser ud til at være en fejl" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Der ser ud til at være en fejl igen" & vbCrLf & Err.Description End Sub

Og det er her det er fungerer ikke som forventet.

Hvis du kører ovenstående kode, vil det stadig give dig en fejl i løbetid, selv efter at den anden fejlhåndterer er på plads.

Dette sker, da vi ikke slettede den første fejl fra VBA's hukommelse.

Ja, vi klarede det! Men det er stadig i hukommelsen.

Og når VBA støder på en anden fejl, sidder den stadig fast med den første fejl, og derfor bruges den anden fejlhåndterer ikke. Koden stopper ved den linje, der forårsagede fejlen, og viser fejlmeddelelsen.

For at rydde VBA's hukommelse og slette den tidligere fejl skal du bruge 'On Error Goto -1'.

Så hvis du tilføjer denne linje i nedenstående kode og kører den, fungerer den som forventet.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Det ser ud til at være en fejl" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Exit Sub ErrMsg2: MsgBox "Der ser ud til at være en fejl igen" & vbCrLf & Err.Description End Sub
Bemærk: Fejlen bliver automatisk slettet, når en underprogram slutter.Så 'On Error Goto -1' kan være nyttig, når du får to eller flere end to fejl i den samme underprogram.

Err -objektet

Når der opstår en fejl med en kode, er det Err -objektet, der bruges til at få detaljerne om fejlen (f.eks. Fejlnummeret eller beskrivelsen).

Fejlobjektegenskaber

Err -objektet har følgende egenskaber:

Ejendom Beskrivelse
Nummer Et tal, der repræsenterer fejltypen. Når der ikke er nogen fejl, er denne værdi 0
Beskrivelse En kort beskrivelse af fejlen
Kilde Projektnavn, hvor fejlen er opstået
HelpContext Hjælpens kontekst -id for fejlen i hjælpefilen
HjælpFil En streng, der repræsenterer mappens placering og filnavnet på hjælpefilen

Selvom du i de fleste tilfælde ikke behøver at bruge Err -objekt, kan det nogle gange være nyttigt, når du håndterer fejl i Excel.

Antag f.eks., At du har et datasæt som vist nedenfor, og for hvert nummer i markeringen vil du beregne kvadratroden i den tilstødende celle.

Nedenstående kode kan gøre det, men da der er en tekststreng i celle A5, viser den en fejl, så snart dette sker.

Sub FindSqrRoot () Dim rng As Range Set rng = markering for hver celle i rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Næste celleafslutning Sub

Problemet med denne type fejlmeddelelse er, at den ikke giver dig noget om, hvad der er gået galt, og hvor problemet opstod.

Du kan bruge Err -objektet til at gøre disse fejlmeddelelser mere meningsfulde.

For eksempel, hvis jeg nu bruger nedenstående VBA -kode, stopper den koden, så snart fejlen opstår og viser en meddelelsesboks med cellens adresse, hvor der er et problem.

Sub FindSqrRoot () Dim rng As Range Set rng = Markering for hver celle I rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Næste celle ErrHandler: MsgBox "Fejlnummer:" & Err .Number & vbCrLf & _ "Error Description:" & Err.Description & vbCrLf & _ "Error at:" & cell.Address End Sub

Ovenstående kode ville give dig meget mere information end den simple 'Type Mismatch', især celleadressen, så du ved, hvor fejlen opstod.

Du kan yderligere forfine denne kode for at sikre, at din kode kører til slutningen (i stedet for at bryde ved hver fejl) og derefter give dig en liste over celleadresser, hvor fejlen opstår.

Nedenstående kode ville gøre dette:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection For each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Error in the following cells" & ErrorCells Exit Sub End Sub Sub

Ovenstående kode løber til slutningen og giver kvadratroden af ​​alle cellerne, der har tal i den (i den tilstødende kolonne). Det viser derefter en meddelelse, der viser alle cellerne, hvor der var en fejl (som vist nedenfor):

Fejl objekt metoder

Selvom egenskaberne Err er nyttige til at vise nyttige oplysninger om fejlene, er der også to fejlmetoder, der kan hjælpe dig med fejlhåndtering.

Metode Beskrivelse
Klar Sletter alle egenskabsindstillingerne for Err -objektet
Hæve Genererer en fejl i løbetid

Lad os hurtigt lære, hvad disse er, og hvordan/hvorfor man bruger dem med VBA i Excel.

Fejl Clear Method

Antag, at du har et datasæt som vist nedenfor, og du vil have kvadratroden af ​​alle disse tal i den tilstødende kolonne.

Den følgende kode får kvadratrødderne til alle tallene i den tilstødende kolonne og viser en meddelelse om, at der opstod en fejl for celle A5 og A9 (da disse har tekst i den).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection For each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Error in the following cells" & ErrorCells End Sub

Bemærk, at jeg har brugt Err.Clear -metoden i If Then -sætningen.

Når der er opstået en fejl og fanget af If -betingelsen, nulstiller Err.Clear -metoden fejlnummeret til 0. Dette sikrer, at IF -tilstand kun fanger fejlene for celler, hvor det er hævet.

Havde jeg ikke brugt Err.Clear -metoden, ville fejlen, når fejlen opstår, altid være sand i IF -tilstanden, og fejlnummeret er ikke blevet nulstillet.

En anden måde at få dette til at fungere er ved at bruge On Error Goto -1, som nulstiller fejlen fuldstændigt.

Bemærk: Err.Clear er forskellig fra On Error Goto -1. Err.Clear sletter kun fejlbeskrivelsen og fejlnummeret. det nulstiller det ikke helt. Dette betyder, at hvis der er en anden fejlforekomst i den samme kode, kan du ikke håndtere den, før du nulstiller den (hvilket kan gøres med 'On Error Goto -1' og ikke ved 'Err.Clear').

Fejlhævningsmetode

Err.Raise-metoden giver dig mulighed for at rejse en fejl i løbetid.

Nedenfor er syntaksen for at bruge Err.Raise -metoden:

Err.Raise [nummer], [kilde], [beskrivelse], [hjælpefil], [helpcontext]

Alle disse argumenter er valgfri, og du kan bruge disse til at gøre din fejlmeddelelse mere meningsfuld.

Men hvorfor vil du nogensinde selv rejse en fejl?

Godt spørgsmål!

Du kan bruge denne metode, når der er en forekomst af en fejl (hvilket betyder, at der alligevel går en fejl), og derefter bruger du denne metode til at fortælle brugeren mere om fejlen (i stedet for den mindre nyttige fejlmeddelelse, som VBA viser som standard).

Antag f.eks., At du har et datasæt som vist nedenfor, og du vil have, at alle cellerne kun skal have numeriske værdier.

Sub RaiseError () Dim rng As Range Set rng = Selection On Error GoTo ErrHandler For each Cell In rng If Not (IsNumeric (Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Ovenstående kode viser en fejlmeddelelse, der har den angivne beskrivelse og kontekstfilen.

Personligt har jeg aldrig brugt Err.Raise, da jeg for det meste kun arbejder med Excel. Men for en person, der bruger VBA til at arbejde med Excel sammen med andre applikationer såsom Outlook, Word eller PowerPoint, kan dette være nyttigt.

Her er en detaljeret artikel om Err.Raise -metode, hvis du vil lære mere.

VBA -fejlhåndtering af bedste praksis

Uanset hvor dygtig du får en skrivende VBA -kode, vil fejl altid være en del af det. De bedste kodere er dem, der har evnerne til at håndtere disse fejl korrekt.

Her er nogle bedste fremgangsmåder, du kan bruge, når det kommer til fejlhåndtering i Excel VBA.

  1. Brug 'On Error Go [Label]' i begyndelsen af ​​koden. Dette vil sikre, at enhver fejl, der kan ske derfra, håndteres.
  2. Brug KUN 'Ved fejl Genoptag næste', når du er sikker på de fejl, der kan opstå. Brug den kun med forventet fejl. Hvis du bruger det med uventede fejl, ignorerer det det simpelthen og går videre. Du kan bruge 'On Error Resume Next' med 'Err.Raise', hvis du vil ignorere en bestemt type fejl og fange resten.
  3. Når du bruger fejlbehandlere, skal du sørge for at bruge Exit Sub før håndtererne. Dette sikrer, at fejlhåndtererkoden kun udføres, når der er en fejl (ellers vil den altid blive udført).
  4. Brug flere fejlbehandlere til at fange forskellige slags fejl. At have flere fejlhåndterere sikrer, at en fejl er rettet korrekt. For eksempel vil du gerne håndtere en 'type mismatch' fejl på en anden måde end en 'Division med 0' fejl i løbetiden.

Håber du fandt denne Excel -artikel nyttig!

Her er nogle flere Excel VBA -selvstudier, som du måske kan lide:

  • Excel VBA -datatyper - En komplet vejledning
  • Excel VBA -sløjfer - Til næste, gør mens, gør indtil, for hver
  • Excel VBA Events - En nem (og komplet) vejledning
  • Excel Visual Basic Editor - Sådan åbnes og bruges det i Excel

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave