Je kunt een macro nog zo goed bouwen, er is altijd een kans dat je script fout loopt. Als je macro bijvoorbeeld afhankelijk is van input data dan kan het voorkomen dat deze input data op een moment anders is dan je verwacht. Dit kan dan resulteren in het vastlopen van je macro script. Wat je dan niet wilt is de eindgebruiker confronteren met een (voor hem of haar) onduidelijke melding met een foutcode. Hier heeft een eindgebruiker die niet bekend is met het schrijven van macro’s geen boodschap aan. Ook zal de Visual basic editor automatisch openen. De editor laat je dan zien op welke regel in je script de macro is vastgelopen. Dit is handig tijdens het debuggen, maar een eindgebruiker willen wij een nette afhandeling van fouten laten zien. Dit doe je door het toepassen van error handling in je macro.
On error goto statement
Het On Error GoTo statement is het belangrijkste onderwerp voor het toepassen van error handling in je macro. Met een On Error GoTo statement zorg jij ervoor dat de eindgebruiker van je macro geen melding met een foutcode meer ziet op het moment dat je script vastloopt. Het on On Error GoTo statement zorgt er namelijk voor dat je code op dat moment doorspringt naar de locatie die jij hebt aangegeven.
Het is aanbevolen om meteen aan je begin van het script een On Error GoTo statement te plaatsen. Dit ziet er als volgt uit binnen je script:
Sub ErrorHandling()
On Error GoTo foutmelding
'--------------
'Inhoud van je macro
'--------------
MsgBox "het script is succesvol afgerond"
Exit Sub
foutmelding:
MsgBox "het script is vastgelopen"
End Sub
Het woord foutmelding kun je vervangen naar wens. De code hierboven is heel simpel opgezet, maar laat duidelijk zien hoe de On Error GoTo in de praktijk werkt. Zodra je macro de regel ‘On Error GoTo foutmelding’ gepasseerd is en het script loopt vast dan schiet je code meteen door naar ‘foutmelding:’. Hij zal dan uitkomen bij de msgbox die jou informeert over het falen van je macro. Op het moment dat je script goed loopt speelt hij de inhoud van je macro goed af, toont hij de msgbox met de tekst ‘het script is succesvol afgerond’ en stopt hij bij de Exit sub.
Zoals je ziet is het dus handig om je on error label (in mijn geval foutmelding) na een exit sub te plaatsen, zodat hij code afspeelt die alleen nodig is op het moment dat je script heeft gefaald. Deze code bestaat normaal gesproken uit het loggen van de error op een bepaalde locatie of via een msgbox. Of het afsluiten van bestanden of andere zaken die tijdens het runnen van deze macro geïnitieerd zijn.
Meerdere On Error GoTo regels in je macro gebruiken
Je kunt binnen je script zoveel mogelijk On Error GoTo labels gebruiken als je zelf wilt. Waarom zou je meer dan 1 label willen gebruiken? Je kunt hiermee specifieker aangeven op welk onderdeel binnen je macro de code vastgelopen is. Laten we een voorbeeld gebruiken waarbij je een macro draait waarvan je weet dat hij op een bepaald punt vast kan lopen. Je weet dan ook exact de reden van het vastlopen van je script.
Sub ErrorHandling()
On Error GoTo foutmelding
'--------------
'Inhoud van je macro
'--------------
On Error GoTo ZoekactieNietGelukt
ResultaatRegel = ThisWorkbook.Sheets("Blad1").Range("B:B").Find("Piet").Row
On Error GoTo foutmelding
MsgBox "het script is succesvol afgerond"
Exit Sub
foutmelding:
MsgBox "algemene foutmelding - contact macroexcel.nl"
Exit Sub
ZoekactieNietGelukt:
MsgBox "De naam Piet niet aanwezig in kolom B. graag toevoegen"
End Sub
In het bovenstaande voorbeeld geef je heel specifiek een error handling aan op de situatie dat de naam ‘Piet’ niet gevonden wordt in kolom B. Omdat je weet op welke regel het script fout loopt in het geval dat de naam niet gevonden wordt kun je de goto regel precies boven de actie plaatsen. Meteen onder de .find functie zorg je er weer voor dat de error handling weer terug gezet wordt naar het label ‘foutmelding’. Nu je meerdere goto regels geplaatst hebt binnen je script moet je ervoor zorgen dat het script stopt na de afhandeling van die fout. Dit doe je door een ‘Exit sub’ te plaatsen.
On Error Resume Next
In de praktijk zul je de On Error Resume Next niet veel gebruiken. Het On Error Resume Next statement zorgt ervoor dat je code doorloopt op het moment dat je script een fout tegen komt. In de meeste gevallen is het namelijk zo dat op het moment dat je script niet werkt dat je geïnformeerd wilt worden over de reden dat je script vastgelopen is. Dan kun je vervolgens namelijk een aanpassing in je macro uitvoeren, waardoor hij niet meer vast hoeft te lopen op dat punt.
On Error GoTo 0 & On Error GoTo -1
Dit zijn beide statements die in de praktijk weinig nut hebben. Met het On Error GoTo 0 statement verwijder je de error handling die je voor dat punt in je macro aangebracht hebt. Op het moment dat je voor deze code een Goto of resume next statement hebt geplaatst zullen deze statements geen effect meer hebben. Op het moment dat je code na gebruik van On Error GoTo 0 fout loopt dan zul je weer een bericht krijgen met een foutcode en zal de Visual Basic Editor je weer laten zien op welk punt in je script je macro hangt.
Met de On Error Goto -1 statement schoon je het geheugen van je error handling. Op het moment dat je script fout gelopen is en de code is doorgestuurd naar een label dan kun je voor de code die zich onder het label bevindt een nieuwe error handling toepassen. Deze zal echter niet werken omdat het geheugen nog gevuld is met de gegevens van je eerste fout in je script. Dit kun je oplossen door na je label eerst het geheugen op te schonen met On Error GoTo -1 en vervolgens een nieuwe On Error GoTo regel te plaatsen voor de code na je eerste Goto label. Ter verduidelijking heb ik deze acties toegepast op het hiervoor gebruikte script.
Mocht de werking van On Error GoTo -1 toch nog niet duidelijk zijn aan de hand van het onderstaande code voorbeeld. Of heb je nog een andere vraag m.b.t. Error handling. Laat het weten in de reacties!
Sub ErrorHandling()
On Error GoTo foutmelding
'--------------
'Inhoud van je macro
'--------------
On Error GoTo ZoekactieNietGelukt
ResultaatRegel = ThisWorkbook.Sheets("Blad1").Range("B:B").Find("Piet").Row
On Error GoTo foutmelding
MsgBox "het script is succesvol afgerond"
Exit Sub
foutmelding:
MsgBox "algemene foutmelding - contact macroexcel.nl"
Exit Sub
ZoekactieNietGelukt:
MsgBox "De naam Piet niet aanwezig in kolom B. graag toevoegen"
On Error GoTo -1
On Error GoTo ErrHandlingCode:
'--------------
'code afhandeling foutmelding ZoekactieNietGelukt
'--------------
Exit Sub
ErrHandlingCode:
MsgBox "Loopt je script nu alweer vast? - contact macroexcel.nl"
End Sub
Pingback:Wat is error handling en waarom belangrijk – n8n helpdesk