Excel VBA-foutafhandeling - Alles wat u moet weten!

Het maakt niet uit hoe ervaren je bent met VBA-codering, fouten zullen er altijd deel van uitmaken.

Het verschil tussen een beginnende en een deskundige VBA-programmeur is dat de deskundige programmeurs weten hoe ze effectief met fouten moeten omgaan en deze kunnen gebruiken.

In deze zelfstudie laat ik u verschillende manieren zien die u kunt gebruiken om fouten effectief af te handelen in Excel VBA.

Voordat we ingaan op VBA-foutafhandeling, laten we eerst de verschillende soorten fouten begrijpen die u waarschijnlijk zult tegenkomen bij het programmeren in Excel VBA.

Soorten VBA-fouten in Excel

Er zijn vier soorten fouten in Excel VBA:

  1. Syntaxisfouten
  2. Compilatie fouten
  3. Runtime-fouten
  4. Logische fouten

Laten we snel begrijpen wat deze fouten zijn en wanneer u deze waarschijnlijk tegenkomt.

Syntax error

Een syntaxisfout, zoals de naam al doet vermoeden, treedt op wanneer VBA iets mis vindt met de syntaxis in de code.

Als u bijvoorbeeld een deel van de instructie/syntaxis vergeet dat nodig is, ziet u de compileerfout.

In de onderstaande code zie ik een compileerfout zodra ik op enter druk na de tweede regel. Dit komt omdat de IF-verklaring moet de ‘Vervolgens' commando, dat ontbreekt in de onderstaande code.

Opmerking: Wanneer u een code typt in Excel VBA, wordt elke zin gecontroleerd zodra u op enter drukt. Als VBA iets mist in de syntaxis, wordt onmiddellijk een bericht weergegeven met wat tekst die u kan helpen het ontbrekende deel te begrijpen.

Om ervoor te zorgen dat u de syntaxisfout ziet wanneer er iets ontbreekt, moet u ervoor zorgen dat Autosyntaxiscontrole is ingeschakeld. Klik hiervoor op 'Extra' en vervolgens op 'Opties'. Zorg ervoor dat in het dialoogvenster Opties de optie 'Automatische syntaxiscontrole' is ingeschakeld.

Als de optie 'Automatische syntaxiscontrole' is uitgeschakeld, zal VBA nog steeds de regel met de syntaxisfout in rood markeren, maar het foutdialoogvenster wordt niet weergegeven.

Compileerfout

Compileerfouten treden op wanneer er iets ontbreekt dat nodig is om de code uit te voeren.

In de onderstaande code wordt bijvoorbeeld de volgende fout weergegeven zodra ik de code probeer uit te voeren. Dit gebeurt omdat ik de IF Then-instructie heb gebruikt zonder deze af te sluiten met de verplichte 'End If'.

Een syntaxisfout is ook een type compileerfout. Er treedt een syntaxisfout op zodra u op enter drukt en VBA identificeert dat er iets ontbreekt. Een compilatiefout kan ook optreden wanneer VBA niets mist tijdens het typen van de code, maar wel wanneer de code wordt gecompileerd of uitgevoerd.

VBA controleert elke regel terwijl u de code typt en markeert de syntaxisfout zodra de regel onjuist is en u op enter drukt. Compileerfouten worden daarentegen pas geïdentificeerd wanneer de volledige code door VBA wordt geanalyseerd.

Hieronder staan ​​​​enkele scenario's waarin u de compileerfout tegenkomt:

  1. Een IF-statement gebruiken zonder de End IF
  2. For-statement gebruiken met de Next
  3. Select-instructie gebruiken zonder de End Select . te gebruiken
  4. De variabele niet declareren (dit werkt alleen als Option Explicit is ingeschakeld)
  5. Een sub/functie aanroepen die niet bestaat (of met verkeerde parameters)
Opmerking over 'Option Explicit': Wanneer u 'Option Explicit' toevoegt, moet u alle variabelen declareren voordat u de code uitvoert. Als er een variabele is die niet is gedeclareerd, geeft VBA een fout weer. Dit is een goede gewoonte omdat het een fout toont in het geval je een verkeerd gespelde variabele hebt. U kunt hier meer lezen over Option Explicit.

Runtime-fouten

Runtime-fouten zijn fouten die optreden wanneer de code wordt uitgevoerd.

Runtime-fouten treden alleen op als alle syntaxis- en compileerfouten zijn verholpen.

Als u bijvoorbeeld code uitvoert die bedoeld is om een ​​Excel-werkmap te openen, maar die werkmap niet beschikbaar is (verwijderd of naam gewijzigd), geeft uw code u een runtime-fout.

Wanneer er een runtime-fout optreedt, wordt de code gestopt en wordt het foutdialoogvenster weergegeven.

Het bericht in het dialoogvenster Runtime-fout is iets nuttiger. Het probeert het probleem uit te leggen dat u kan helpen het te corrigeren.

Als u op de knop Debug klikt, wordt het deel van de code gemarkeerd dat tot de fout leidt.

Als u de fout hebt gecorrigeerd, kunt u op de knop Uitvoeren in de werkbalk klikken (of op F5) klikken om de code verder uit te voeren vanaf het punt waar deze was gebleven.

Of u kunt ook op de knop Einde klikken om uit de code te komen.

Belangrijk: Als u op de knop Einde klikt in het dialoogvenster, wordt de code gestopt op de regel die wordt aangetroffen. Alle regels code daarvoor zouden echter zijn uitgevoerd.

Logische fouten

Logische fouten zouden uw code niet laten stoppen, maar kunnen tot verkeerde resultaten leiden. Dit kunnen ook de moeilijkste soorten fouten zijn om op te lossen.

Deze fouten worden niet gemarkeerd door de compiler en moeten handmatig worden aangepakt.

Een voorbeeld van een logische fout (waar ik vaak aan vast zit) is dat ik in een eindeloze lus terechtkom.

Een ander voorbeeld zou kunnen zijn wanneer het een resultaat geeft dat verkeerd is. U kunt bijvoorbeeld een verkeerde variabele in de code gebruiken of twee variabelen toevoegen waarvan er één onjuist is.

Er zijn een paar manieren die ik gebruik om logische fouten aan te pakken:

  1. Plaats een berichtvenster op een bepaalde plaats in de code en markeer waarden/gegevens die kunnen helpen begrijpen of alles verloopt zoals verwacht.
  2. In plaats van de code in één keer uit te voeren, doorloop je elke regel één voor één. Klik hiervoor ergens in de code en druk op F8. u zou merken dat elke keer dat u op F8 drukt, één regel wordt uitgevoerd. Hiermee kunt u de code regel voor regel doorlopen en de logische fouten identificeren.

Debug gebruiken om compilatie-/syntaxisfouten te vinden

Als u klaar bent met de code, is het een goede gewoonte om deze eerst te compileren voordat u deze uitvoert.

Om een ​​code te compileren, klikt u op de optie Debug in de werkbalk en vervolgens op Compile VBAProject.

Wanneer u een VBA-project compileert, doorloopt het de code en identificeert het eventuele fouten.

Als er een fout wordt gevonden, wordt er een dialoogvenster met de fout weergegeven. Het vindt fouten één voor één. Dus als het een fout vindt en je hebt het gecorrigeerd, moet je compileren opnieuw uitvoeren om andere fouten te vinden (als die er zijn).

Als uw code geen fouten bevat, wordt de optie Compile VBAProject grijs weergegeven.

Merk op dat tijdens het compileren alleen 'Syntaxis'-fouten en 'Compilatie'-fouten worden gevonden. Het zal de runtime-fouten NIET vinden.

Wanneer u VBA-code schrijft, wilt u niet dat de fouten opduiken. Om dit te voorkomen, zijn er veel methoden voor foutafhandeling die u kunt gebruiken.

In de volgende paragrafen van dit artikel behandel ik de methoden die u kunt gebruiken voor VBA-foutafhandeling in Excel.

Foutinstellingen configureren (verwerkte versus onverwerkte fouten)

Voordat u aan de slag gaat met uw code, moet u controleren op één instelling in Excel VBA.

Ga naar de VBA-werkbalk en klik op Extra en klik vervolgens op Opties.

Klik in het dialoogvenster Opties op het tabblad Algemeen en zorg ervoor dat binnen de groep 'Error Trapping' 'Break on Unhandled Errors' is aangevinkt.

Ik zal de drie opties uitleggen:

  1. Breken op alle fouten: Dit stopt uw ​​code bij alle soorten fouten, zelfs als u de technieken hebt gebruikt om deze fouten af ​​te handelen.
  2. Break in Class-module: Dit zal uw code stoppen bij alle onverwerkte fouten, en tegelijkertijd, als u objecten zoals Userforms gebruikt, zal het ook binnen die objecten breken en de exacte regel markeren die de fout veroorzaakt.
  3. Pauze bij onverwerkte fouten: Dit stopt uw ​​code alleen voor die fouten die niet worden afgehandeld. Dit is de standaardinstelling omdat het ervoor zorgt dat onverwerkte fouten onder uw aandacht worden gebracht. Als u objecten zoals Userforms gebruikt, wordt niet de regel gemarkeerd die de fout in het object veroorzaakt, maar wordt alleen de regel gemarkeerd die naar dat object verwijst.
Opmerking: Werk je met objecten zoals Userforms, dan kun je deze instelling wijzigen in ‘Break on Class Modules’. Het verschil tussen #2 en #3 is dat wanneer je Break in Class Module gebruikt, het je naar de specifieke regel in het object brengt die de fout veroorzaakt. Je kunt er ook voor kiezen om hiermee verder te gaan in plaats van 'Break on Unhandled Errors'.

Dus in een notendop: als u net begint met Excel VBA, zorg er dan voor dat 'Break on Unhandled Errors' is aangevinkt.

VBA-foutafhandeling met 'On Error'-verklaringen

Wanneer uw code een fout tegenkomt, zijn er een paar dingen die u kunt doen:

  1. Negeer de fout en laat de code doorgaan
  2. Zorg voor een foutafhandelingscode en voer deze uit wanneer er een fout optreedt

Beide foutafhandelingsmethoden zorgen ervoor dat de eindgebruiker geen fout te zien krijgt.

Er zijn een paar 'On Error'-instructies die u kunt gebruiken om deze voor elkaar te krijgen.

Bij fout Hervatten volgende

Wanneer u 'On Error Resume Next' in uw code gebruikt, wordt elke aangetroffen fout genegeerd en blijft de code actief.

Deze methode voor foutafhandeling wordt vrij vaak gebruikt, maar u moet voorzichtig zijn bij het gebruik ervan. Aangezien het alle fouten die kunnen optreden volledig negeert, kunt u mogelijk niet de fouten identificeren die moeten worden gecorrigeerd.

Als de onderstaande code bijvoorbeeld wordt uitgevoerd, wordt er een fout geretourneerd.

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

Dit gebeurt omdat je een getal niet door nul kunt delen.

Maar als ik de instructie 'On Error Resume Next' in deze code gebruik (zoals hieronder weergegeven), wordt de fout genegeerd en weet ik niet dat er een probleem is dat moet worden gecorrigeerd.

Sub AssignValues() Bij Fout Hervatten Volgende x = 20 / 4 y = 30 / 0 Einde Sub

On Error Resume Next mag alleen worden gebruikt als u duidelijk weet welk soort fouten uw VBA-code naar verwachting zal veroorzaken en het is goed om deze te negeren.

Hieronder staat bijvoorbeeld de VBA-gebeurteniscode die onmiddellijk de datum- en tijdwaarde in cel A1 van een nieuw ingevoegd blad zou toevoegen (deze code wordt toegevoegd in het werkblad en niet in een module).

Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Format(Now, "dd-mmm-yyyy uu:mm:ss") End Sub

Hoewel dit in de meeste gevallen prima werkt, zou er een fout optreden als ik een grafiekblad toevoeg in plaats van een werkblad. Aangezien een grafiekblad geen cellen heeft, zou de code een fout veroorzaken.

Dus als ik de instructie 'On Error Resume Next' in deze code gebruik, werkt het zoals verwacht met werkbladen en doet het niets met grafiekbladen.

Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Hervat volgende Sh.Range("A1") = Format(Now, "dd-mmm-yyyy uu:mm:ss") End Sub

Opmerking: Volgende instructie hervatten bij fout kan het beste worden gebruikt als u weet wat voor soort fouten u waarschijnlijk zult tegenkomen. En als u denkt dat het veilig is om deze fouten te negeren, kunt u het gebruiken.

U kunt deze code naar een hoger niveau tillen door te analyseren of er een fout is opgetreden en er een relevant bericht voor weer te geven.

De onderstaande code toont een berichtvenster waarin de gebruiker wordt geïnformeerd dat er geen werkblad is ingevoegd.

Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Hervat volgende Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") Als Err.Number 0 Dan MsgBox "Lijkt op jou een kaartblad ingevoegd" & vbCrLf & "Error - " & Err.Beschrijving End If End Sub

'Err.Number' wordt gebruikt om het foutnummer te krijgen en 'Err.Description' wordt gebruikt om de foutbeschrijving te krijgen. Deze worden later in deze tutorial behandeld.

Bij fout Ga naar 0

'On Error GoTo 0' stopt de code op de regel die de fout veroorzaakt en toont een berichtvenster dat de fout beschrijft.

In eenvoudige bewoordingen schakelt het het standaard foutcontrolegedrag in en toont het de standaardfoutmelding.

Waarom dan nog gebruiken?

Normaal gesproken hoeft u 'On Error Goto 0' niet te gebruiken, maar het kan handig zijn wanneer u het gebruikt in combinatie met 'On Error Resume Next'

Laat het me uitleggen!

De onderstaande code zou alle lege cellen in de selectie selecteren.

Sub SelectFormulaCells() Selection.SpecialCells(xlCellTypeBlanks).Select End Sub

Maar het zou een fout tonen wanneer er geen lege cellen in de geselecteerde cellen zijn.

Dus om te voorkomen dat de fout wordt weergegeven, kunt u On Error Resume next gebruiken'

Nu zal het ook een fout weergeven wanneer u de onderstaande code uitvoert:

Sub SelectFormulaCells() Bij fout Volgende selectie hervatten.SpecialCells(xlCellTypeBlanks).Select End Sub

Tot nu toe, zo goed!

Het probleem doet zich voor wanneer er een deel van de code is waar fouten kunnen optreden, en aangezien u 'On Error Resume Next' gebruikt, negeert de code het gewoon en gaat naar de volgende regel.

In de onderstaande code zou er bijvoorbeeld geen foutmelding zijn:

Sub SelectFormulaCells() Bij fout Volgende selectie hervatten.SpecialCells(xlCellTypeBlanks).Selecteer '… meer code die fout kan bevatten End Sub

In de bovenstaande code zijn er twee plaatsen waar een fout kan optreden. De eerste plaats is waar we alle lege cellen selecteren (met behulp van Selection.SpecialCells) en de tweede is in de resterende code.

Hoewel de eerste fout wordt verwacht, is een eventuele fout daarna niet meer.

Dit is waar On Error Goto 0 te hulp komt.

Wanneer u het gebruikt, reset u de foutinstelling naar de standaard, waar het fouten begint te vertonen wanneer het het tegenkomt.

In de onderstaande code zou er bijvoorbeeld geen fout zijn als er geen lege cellen zijn, maar er zou een foutmelding zijn vanwege '10/0'

Sub SelectFormulaCells() Bij fout Volgende selectie hervatten.SpecialCells(xlCellTypeBlanks).Selecteer bij fout GoTo 0 '… meer code die fout kan bevatten End Sub

Bij fout Ga naar [Label]

Met de bovenstaande twee methoden - 'On Error Resume Next' en 'On Error Goto 0' - kunnen we de fout niet echt afhandelen. De ene zorgt ervoor dat de code de fout negeert en de tweede hervat de foutcontrole.

On Error Go [Label] is een manier waarmee je kunt specificeren wat je wilt doen als je code een fout bevat.

Hieronder staat de codestructuur die deze fouthandler gebruikt:

Sub Test() On Error GoTo Label: X = 10 / 0 'deze regel veroorzaakt een fout'… .uw resterende code komt hier Exit Sub Label: ' code om de fout af te handelen End Sub

Merk op dat er vóór de foutafhandeling 'Label' een Exit Sub is. Dit zorgt ervoor dat als er geen fouten zijn, de sub wordt afgesloten en de 'Label'-code niet wordt uitgevoerd. Als u Exit Sub niet gebruikt, zal het altijd de 'Label'-code uitvoeren.

In de voorbeeldcode hieronder, wanneer er een fout optreedt, springt de code en voert de code uit in de handlersectie (en toont een berichtvenster).

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Er lijkt een fout te zijn" & vbCrLf & Err.Beschrijving End Sub

Merk op dat wanneer er een fout optreedt, de code al is uitgevoerd en de regels heeft uitgevoerd vóór de regel die de fout veroorzaakt. In het bovenstaande voorbeeld stelt de code de waarde van X in op 12, maar aangezien de fout in de volgende regel optreedt, worden de waarden voor Y en Z niet ingesteld.

Zodra de code naar de foutafhandelingscode springt (ErrMsg in dit voorbeeld), zal het doorgaan met het uitvoeren van alle regels in en onder de foutafhandelingscode en het verlaten van de sub.

Bij fout Ga naar -1

Deze is een beetje ingewikkeld en in de meeste gevallen zult u dit waarschijnlijk niet gebruiken.

Maar ik zal dit nog steeds behandelen, omdat ik een situatie heb meegemaakt waarin dit nodig was (voel je vrij om het te negeren en naar het volgende gedeelte te gaan als je alleen op zoek bent naar de basis).

Voordat ik inga op de mechanica ervan, wil ik proberen uit te leggen waar het nuttig kan zijn.

Stel dat u een code heeft waarin een fout is opgetreden. Maar alles is goed, want je hebt één foutafhandelaar. Maar wat gebeurt er als er nog een fout in de foutafhandelingscode zit (ja … een beetje zoals de beginfilm).

In een dergelijk geval kunt u de tweede handler niet gebruiken omdat de eerste fout niet is gewist. Dus terwijl je de eerste fout hebt afgehandeld, bestaat deze nog steeds in het geheugen van VBA. En het VBA-geheugen heeft slechts plaats voor één fout - niet twee of meer dan dat.

In dit scenario kunt u On Error Goto -1 gebruiken.

Het wist de fout en maakt VBA-geheugen vrij om de volgende fout af te handelen.

Genoeg gepraat!

Laten we het nu uitleggen aan de hand van voorbeelden.

Stel ik heb de onderstaande code. Dit geeft een fout omdat er een deling door nul is.

Sub Errorhandler() X = 12 Y = 20 / 0 Z = 30 End Sub

Dus om het af te handelen, gebruik ik een foutafhandelingscode (met de naam ErrMsg) zoals hieronder weergegeven:

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Er lijkt een fout te zijn" & vbCrLf & Err.Beschrijving End Sub

Alles is nu weer goed. Zodra de fout optreedt, wordt de foutafhandelaar gebruikt en wordt een berichtvenster weergegeven zoals hieronder weergegeven.

Nu breid ik de code uit zodat ik meer code in of na de foutafhandelaar heb.

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Er lijkt een fout te zijn" & vbCrLf & Err.Beschrijving A = 10 / 2 B = 35 / 0 End Sub

Aangezien de eerste fout is afgehandeld, maar de tweede niet, zie ik opnieuw een fout zoals hieronder wordt weergegeven.

Nog allemaal goed. De code gedraagt ​​zich zoals we verwacht hadden.

Dus om de tweede fout af te handelen, gebruik ik een andere foutafhandelaar (ErrMsg2).

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Er lijkt een fout te zijn" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Er lijkt weer een fout te zijn opgetreden" & vbCrLf & Err.Beschrijving End Sub

En dit is waar het werkt niet zoals verwacht.

Als u de bovenstaande code uitvoert, krijgt u nog steeds een runtime-fout, zelfs nadat de tweede foutafhandelaar is geïnstalleerd.

Dit gebeurt omdat we de eerste fout niet uit het geheugen van VBA hebben gewist.

Ja, we hebben het geregeld! Maar het blijft in het geheugen.

En wanneer VBA een andere fout tegenkomt, zit deze nog steeds vast met de eerste fout en daarom wordt de tweede foutafhandelaar niet gebruikt. De code stopt bij de regel die de fout heeft veroorzaakt en geeft de foutmelding weer.

Om het geheugen van VBA te wissen en de vorige fout te wissen, moet u de 'On Error Goto -1' gebruiken.

Dus als u deze regel in de onderstaande code toevoegt en uitvoert, werkt deze zoals verwacht.

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Er lijkt een fout te zijn" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Er lijkt weer een fout te zijn opgetreden" & vbCrLf & Err.Description End Sub
Opmerking: De fout wordt automatisch gewist wanneer een subroutine eindigt.Dus 'On Error Goto -1' kan handig zijn als u twee of meer dan twee fouten in dezelfde subroutine krijgt.

Het Err-object

Wanneer er een fout optreedt met een code, wordt het Err-object gebruikt om de details over de fout te krijgen (zoals het foutnummer of de beschrijving).

Eigenschappen van foutobject

Het Err-object heeft de volgende eigenschappen:

Eigendom Beschrijving
Nummer Een getal dat het type fout aangeeft. Als er geen fout is, is deze waarde 0
Beschrijving Een korte beschrijving van de fout
Bron Projectnaam waarin de fout is opgetreden
HelpContext Het help-context-ID voor de fout in het helpbestand
Helpbestand Een tekenreeks die de maplocatie en de bestandsnaam van het helpbestand vertegenwoordigt

Hoewel u in de meeste gevallen het Err-object niet hoeft te gebruiken, kan het soms handig zijn bij het afhandelen van fouten in Excel.

Stel dat u een gegevensset hebt zoals hieronder weergegeven en voor elk getal in de selectie wilt u de vierkantswortel in de aangrenzende cel berekenen.

De onderstaande code kan het, maar aangezien er een tekstreeks in cel A5 staat, wordt er een fout weergegeven zodra dit gebeurt.

Sub FindSqrRoot() Dim rng As Range Set rng = Selectie voor elke cel In rng cell.Offset(0, 1).Value = Sqr(cell.Value) Volgende cel End Sub

Het probleem met dit type foutmelding is dat het u niets vertelt over wat er is misgegaan en waar het probleem zich heeft voorgedaan.

U kunt het Err-object gebruiken om deze foutmeldingen zinvoller te maken.

Als ik nu bijvoorbeeld de onderstaande VBA-code gebruik, wordt de code gestopt zodra de fout optreedt en wordt een berichtvenster weergegeven met het celadres van de cel waar er een probleem is.

Sub FindSqrRoot() Dim rng As Range Set rng = Selectie voor elke cel In rng On Error GoTo ErrHandler cell.Offset(0, 1).Value = Sqr(cell.Value) Volgende cel ErrHandler: MsgBox "Foutnummer:" & Err .Number & vbCrLf & _ "Foutbeschrijving: " & Err.Beschrijving & vbCrLf & _ "Fout bij: " & cel.Adres End Sub

De bovenstaande code zou u veel meer informatie geven dan het simpele 'Type Mismatch', vooral het celadres, zodat u weet waar de fout is opgetreden.

U kunt deze code verder verfijnen om ervoor te zorgen dat uw code tot het einde loopt (in plaats van bij elke fout te breken) en u vervolgens een lijst geeft met het celadres waar de fout optreedt.

De onderstaande code zou dit doen:

Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Hervatten Volgende Set rng = Selectie voor elke cel In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number 0 Dan ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Fout in de volgende cellen" & ErrorCells Exit Sub End Sub

De bovenstaande code loopt tot het einde en geeft de vierkantswortel van alle cellen die getallen bevatten (in de aangrenzende kolom). Vervolgens wordt een bericht weergegeven met alle cellen waarin een fout is opgetreden (zoals hieronder weergegeven):

Err Object-methoden

Hoewel de Err-eigenschappen handig zijn om nuttige informatie over de fouten weer te geven, zijn er ook twee Err-methoden die u kunnen helpen bij het afhandelen van fouten.

Methode Beschrijving
Duidelijk Wist alle eigenschapsinstellingen van het Err-object
Salarisverhoging Genereert een runtime-fout

Laten we snel leren wat deze zijn en hoe / waarom deze te gebruiken met VBA in Excel.

Fout wissen methode

Stel dat je een dataset hebt zoals hieronder getoond en je wilt de vierkantswortel van al deze getallen in de aangrenzende kolom.

De volgende code haalt de vierkantswortels van alle getallen in de aangrenzende kolom en toont een bericht dat er een fout is opgetreden voor cel A5 en A9 (omdat deze tekst bevatten).

Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Hervatten Volgende Set rng = Selectie voor elke cel In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number 0 Dan ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Fout in de volgende cellen" & ErrorCells End Sub

Merk op dat ik de Err.Clear-methode heb gebruikt in de If Then-instructie.

Zodra er een fout is opgetreden en wordt ondervangen door de If-voorwaarde, stelt de Err.Clear-methode het foutnummer weer in op 0. Dit zorgt ervoor dat de IF-voorwaarde alleen de fouten opvangt voor cellen waar deze wordt gegenereerd.

Als ik de Err.Clear-methode niet had gebruikt, zou deze, zodra de fout optreedt, altijd waar zijn in de IF-conditie en is het foutnummer niet opnieuw ingesteld.

Een andere manier om dit te laten werken is door de On Error Goto -1 te gebruiken, die de fout volledig reset.

Opmerking: Err.Clear verschilt van On Error Goto -1. Err.Clear wist alleen de foutbeschrijving en het foutnummer. het reset het niet volledig. Dit betekent dat als er nog een fout in dezelfde code zit, u deze niet kunt afhandelen voordat u deze opnieuw instelt (wat kan worden gedaan met 'On Error Goto -1' en niet met 'Err.Clear').

Err Raise Methode

Met de Err.Raise-methode kunt u een runtime-fout genereren.

Hieronder staat de syntaxis van het gebruik van de Err.Raise-methode:

Err.Verhoog [nummer], [bron], [beschrijving], [helpbestand], [helpcontext]

Al deze argumenten zijn optioneel en u kunt deze gebruiken om uw foutmelding zinvoller te maken.

Maar waarom zou je ooit zelf een fout willen melden?

Goede vraag!

U kunt deze methode gebruiken wanneer er een fout optreedt (wat betekent dat er toch een fout gaat) en vervolgens deze methode gebruiken om de gebruiker meer over de fout te vertellen (in plaats van de minder nuttige foutmelding die VBA laat zien standaard).

Stel dat u een gegevensset hebt zoals hieronder weergegeven en dat u wilt dat alle cellen alleen numerieke waarden hebben.

Sub RaiseError() Dim rng As Range Set rng = Selectie bij fout Ga naar ErrHandler voor elke cel in rng Indien niet (IsNumeric(Cell.Value)) Dan Err.Raise vbObjectError + 513, Cell.Address, "Geen nummer", " Test.html" End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

De bovenstaande code zou een foutmelding weergeven met de opgegeven beschrijving en het contextbestand.

Persoonlijk heb ik Err.Raise nooit gebruikt, omdat ik meestal alleen met Excel werk. Maar voor iemand die VBA gebruikt om met Excel samen met andere applicaties zoals Outlook, Word of PowerPoint te werken, kan dit handig zijn.

Hier is een gedetailleerd artikel over de Err.Raise-methode voor het geval u meer wilt weten.

VBA-foutafhandeling best practices

Het maakt niet uit hoe bekwaam je een VBA-code schrijft, fouten zullen er altijd deel van uitmaken. De beste programmeurs zijn degenen die de vaardigheden hebben om deze fouten op de juiste manier af te handelen.

Hier zijn enkele best practices die u kunt gebruiken als het gaat om foutafhandeling in Excel VBA.

  1. Gebruik 'On Error Go [Label]' aan het begin van de code. Dit zorgt ervoor dat eventuele fouten die vanaf daar kunnen optreden, worden afgehandeld.
  2. Gebruik 'On Error Resume Next' ALLEEN als u zeker bent van de fouten die kunnen optreden. Gebruik het alleen met verwachte fouten. In het geval dat u het met onverwachte fouten gebruikt, zal het het gewoon negeren en verder gaan. U kunt 'On Error Resume Next' gebruiken met 'Err.Raise' als u een bepaald type fout wilt negeren en de rest wilt opvangen.
  3. Zorg er bij het gebruik van fouthandlers voor dat u Exit Sub gebruikt vóór de handlers. Dit zorgt ervoor dat de foutafhandelingscode alleen wordt uitgevoerd als er een fout is (anders wordt deze altijd uitgevoerd).
  4. Gebruik meerdere fouthandlers om verschillende soorten fouten op te vangen. Het hebben van meerdere foutafhandelingen zorgt ervoor dat een fout correct wordt aangepakt. U wilt bijvoorbeeld een 'type mismatch'-fout anders afhandelen dan een runtime-fout 'Delen door 0'.

Ik hoop dat je dit Excel-artikel nuttig vond!

Hier zijn nog enkele Excel VBA-zelfstudies die u misschien leuk vindt:

  • Excel VBA-gegevenstypen - een complete gids
  • Excel VBA-loops - voor volgende, doe terwijl, doe tot, voor elk
  • Excel VBA-evenementen - Een eenvoudige (en complete) gids
  • Excel Visual Basic Editor - Hoe te openen en gebruiken in Excel

U zal helpen de ontwikkeling van de site, het delen van de pagina met je vrienden

wave wave wave wave wave