Soorten vba-fouten: foutopsporing en oplossing
Net als elke andere programmeertaal heeft VBA pech als het om fouten gaat en je moet er hoe dan ook mee omgaan. Ze kunnen uit verschillende bronnen komen, zoals slechte codering, onmogelijke bewerkingen (zoals delen door nul) of onverwachte fouten.
De beste manier om hiermee om te gaan, is door een goed inzicht te hebben in alle mogelijke resultaten die u met de code kunt bereiken. Kijk naar het onderstaande voorbeeld waarin we een VBA-code hebben die de vierkantswortel van het getal berekent met behulp van de waarde die u in de geselecteerde cel heeft.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
Maar als de actieve cel een andere waarde dan een getal heeft, krijgt u een runtime-fout, zoals hieronder.
Foutparameters in VBA (foutopsporing)
In de VBA-optie kunt u de instelling configureren om fouten af te handelen voordat u begint met het schrijven van codes. Om de VBA-instellingen te openen, gaat u naar Extra ➤ Opties ➤ Algemeen ➤ Foutopsporing. Hier heb je drie opties die je kunt gebruiken.
- Stop bij alle fouten : Als u deze optie hebt ingeschakeld, stopt VBA de code voor alle soorten fouten, zelfs als u allerlei foutafhandelingstechnieken hebt gebruikt.
- Tampering Class Module : Met deze optie stopt VBA al uw codes die door geen enkele techniek worden afgehandeld. En als u objecten zoals Userforms gebruikt, zal het ook in die objecten opsplitsen en de exacte regel markeren waar de fout zit.
- Onderbreking bij onverwerkte fouten : dit is de standaardinstelling die u helpt alle fouten te kennen waarvoor u geen technieken voor foutafhandeling gebruikt en de code voor alle onverwerkte fouten stopt. (Maar als u objecten zoals Userforms gebruikt, zal dit niet de regel markeren die de fout in het object veroorzaakt, maar alleen de regel markeren die naar dat object verwijst).
Soorten VBA-fouten
Om VBA-fouten te begrijpen, kunt u ze in vier categorieën verdelen. Hieronder vindt u de uitleg van dit soort fouten.
1. Syntaxisfouten
Tijdens het schrijven van VBA-code moet u een bepaalde syntaxis volgen en als u deze negeert of niet schrijft zoals zou moeten, kunt u te maken krijgen met een SYNTAX-fout (ook wel taalfout genoemd). Het zijn net typefouten die u maakt tijdens het schrijven van uw codes.
Welnu, VBA helpt u door deze fouten te melden door een foutmelding weer te geven. U hoeft er alleen maar voor te zorgen dat “Auto Syntax Check” is ingeschakeld in uw VB-editor.
Ga naar Gereedschap ➤ Opties en zorg ervoor dat het vakje “Automatische syntaxiscontrole” is aangevinkt. Hierdoor geeft VBA, telkens wanneer u een SYNTAX-fout maakt, een foutmelding weer.
Maar als “Auto Syntax Check” is uitgeschakeld, markeert VBA nog steeds de coderegel met de fout, maar wordt de foutmelding niet weergegeven.
2. Compilatiefouten
Dit gebeurt wanneer u code schrijft om een activiteit uit te voeren, maar die activiteit is ongeldig of kan niet door VBA worden uitgevoerd. Het beste voorbeeld is waar je een code hebt die de IF-instructie gebruikt, maar je hebt gemist om END IF aan het einde van de instructie toe te voegen en nu, wanneer je deze VBA uitvoert, krijg je een compilatiefoutmelding te zien.
Daarnaast zijn er nog andere voorbeelden van compilatiefouten:
- Voor gebruiken zonder Volgende ( Voor Volgende ).
- Selecteer zonder het einde te selecteren ( Selecteer case ).
- Declareer geen variabele als u “ Expliciete optie ” hebt ingeschakeld.
- Een sub/functie aanroepen die niet bestaat.
3. Runtimefouten
Er treedt een runtimefout op wanneer de code wordt uitgevoerd. Denk aan het voorbeeld dat ik hierboven met je deelde, toen de code de vierkantswortel van een getal berekende.
Wanneer er een runtime-fout optreedt tijdens het uitvoeren van de code, wordt de code gestopt en wordt het foutdialoogvenster weergegeven. Dit foutvenster vertelt over de aard van de fout die u heeft. Stel dat u code hebt geschreven die een werkmap opent vanaf de door u opgegeven locatie, maar die werkmap wordt nu door iemand verplaatst of verwijderd.
Dus wanneer u de code uitvoert, toont VBA u een runtime-fout omdat het dit bestand op deze locatie niet kan vinden. Het bericht dat u krijgt bij een runtimefout beschrijft de reden, zodat u de reden voor de fout kunt begrijpen.
En als er een runtimefout optreedt, wordt de uitvoering van de code stopgezet. Als u op de knop ‘Debug’ klikt, wordt de coderegel weergegeven die deze fout bevat door deze geel te markeren. Of u kunt op de knop “Einde” klikken om de uitvoering van de code te stoppen en de foutmelding te sluiten.
4. Logische fout
Dit is geen fout, maar een fout tijdens het schrijven van de code. Dit soort fouten kunnen soms problemen opleveren bij het vinden en oplossen ervan.
Stel dat u code aan het schrijven bent en bij het declareren van een variabele het verkeerde gegevenstype gebruikt of de verkeerde berekeningsstappen hebt gebruikt. In dit geval werkt uw code prima en zult u deze fout niet gemakkelijk vinden. De beste manier om met dit soort problemen om te gaan, is door elke regel code één voor één uit te voeren.
Foutopsporingstools gebruiken in VBA
VBA biedt u een reeks hulpmiddelen om uw code te debuggen en bugs uit uw codes te verwijderen.
1. Compileer het VBA-project
In Visual Basic Editor is er een optie die u direct kunt gebruiken nadat u uw code hebt voltooid. Deze compilatieopties analyseren elke regel van uw code en geven een berichtvenster weer als er een fout in uw code zit.
Opmerking: de optie VBA compileren spoort alleen syntaxis- en compilatiefouten op, geen runtimefouten, omdat deze fouten alleen optreden als er code wordt uitgevoerd. Om het Compile VBA Project te gebruiken, gaat u naar ➤ Debug ➤ Compile VBA Project.
Zodra u “Compile VBA Project” hebt uitgevoerd en er geen fouten in uw code voorkomen, worden de opties grijs weergegeven.
2. Voer elke coderegel één voor één uit
Dit is hoe ik het doe. Wanneer ik een code voltooi, voer ik deze eenvoudigweg regel voor regel uit om te controleren of er een fout is. Dit kan enige tijd duren, maar het helpt u bij het oplossen van alle fouten (syntaxis, compilatie en uitvoering).
Op de “Debug Toolbar” bevindt zich een knop “Stap In” die u kunt gebruiken om code regel voor regel uit te voeren, of u kunt eenvoudig op F8 drukken om een enkele regel uit te voeren en er vervolgens nogmaals op drukken om de volgende regel in de code uit te voeren.
De instructie “On ERROR” gebruiken om VBA-fouten af te handelen
Het is belangrijk om uw codes te controleren en mogelijke fouten te vinden in alle beschikbare foutopsporingsmethoden. Maar de beste en meest efficiënte manier is om instructies voor foutafhandeling te maken die een fout kunnen afhandelen en uw code foutloos kunnen maken wanneer deze wordt uitgevoerd. Laten we deze uitspraken onderzoeken. Wanneer er een fout optreedt in een VBA-code, kunnen de beste manieren om deze fout af te handelen de volgende zijn:
- Laat de VBA de fout negeren en de code uitvoeren
- Laat een speciale set instructies uitvoeren als er een fout optreedt.
In beide oplossingen kunt u ‘On Error’-instructies gebruiken. Hieronder staan vier “On Error”-instructies die u kunt gebruiken. En laten we nu elke uitspraak een voor een bekijken.
1. Als je een fout maakt, begin dan opnieuw
Met deze eenvoudige coderegel kan VBA doorgaan met het uitvoeren van de code, ondanks dat er een fout is opgetreden. Het IDEE is simpel: ga naar de volgende regel code als er ergens tijdens de uitvoering een fout wordt gedetecteerd.
In de onderstaande code heb je twee regels code:
- De eerste regel geeft aan dat de waarde in cel A1 25 gedeeld door 0 is
- En de tweede regel zegt dat celwaarde A2 10 gedeeld door 5 is
Nu is er een probleem met de code die u online heeft. Zoals u weet, is het resultaat een fout als u iets door 0 deelt. Dus wanneer u deze code uitvoert, geeft VBA een foutmelding “Runtime error ’11’ Divide by zero” weer en stopt de uitvoering.
Maar wanneer u helemaal aan het begin van de code “On Error Resume Next” toevoegt en de code uitvoert, negeert VBA eenvoudigweg de coderegel waar de fout optreedt en gaat verder met de tweede regel en voegt die waarde toe in cel A2.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
Dus wanneer u wilt dat uw code wordt uitgevoerd ondanks dat er ergens een fout optreedt, gebruikt u gewoon de instructie ‘On Error Resume Next’ in uw code.
Maar er is nog één ding dat u moet opmerken: het negeert alleen fouten die daarna optreden.
Stel dat er een fout optreedt op regel 5 en u hebt “On Error Resume Next” toegevoegd op regel 8, dan wordt deze fout niet overgeslagen. De beste manier is dus om het toe te voegen als de eerste regel code in de procedure.
2. In geval van een GoTo 0-fout
Dit is het standaardgedrag van VBA: wanneer er een fout optreedt, wordt de uitvoering van de code gestopt.
Welnu, het gebruik van “On Error GoTo 0” maakt geen verschil in uw code. VBA stopt eenvoudigweg de code en geeft een bericht weer met een beschrijving van de fout. Dus waarom zou ik de moeite nemen om het te gebruiken? Slimme vraag. Laten we het voorbeeld gebruiken dat u hierboven gebruikte in ” Bij fout hervatten volgende “.
In deze code neemt VBA, wanneer er een fout optreedt, de volgende regel code en voert deze uit, zonder dat u een foutmelding ziet. Maar stel dat uw code meer regels bevat en u wilt deze regels niet overschrijden als er een fout in de code zit.
Dus als u “On Error GoTo 0” invoert na de tweede regel code, wordt de standaardfoutafhandelaar van VBA hersteld, die foutmeldingen weergeeft wanneer er een fout optreedt.
3. In geval van een GoTo-fout [Label]
Denk aan een plek in een gebouw waar je in geval van nood naartoe kunt gaan. Op dezelfde manier kunt u met “On Error GoTo [Label]” eenvoudigweg een apart codeblok in uw hoofdcode maken om een fout af te handelen.
In feite is “On Error GoTo [Label]” een veel betere en gemakkelijkere manier om met fouten om te gaan. In de onderstaande code heb je “On Error GoTo Oh!” Error” nu in deze regeldeclaratie, het woord “Oh!” Fout” is het label.
Als je naar het einde van de code kijkt, begin je specifiek met de labelnaam en vervolgens een code voor een berichtenvenster met een bericht op de code.
Wat gebeurt er nu als er een fout optreedt, de VBA springt naar het label “Oh! Error” en zal het codeblok uitvoeren dat je na dat label hebt.
Maar er is één ding waar u op moet letten: als er geen fout optreedt, wordt het label dat u in uw code heeft uitgevoerd. Er zijn twee dingen die u moet doen:
- Zorg er eerst voor dat u uw fouttag aan het einde van de code toevoegt.
- Ten tweede, voeg een “Exit Sub” toe vóór het foutlabel.
Hiermee profiteert u in beide situaties. Laten we zeggen dat als er een fout optreedt en VBA overschakelt naar het label dat u hebt opgegeven, er alleen code van het label zelf naar de code zal zijn. En als er geen fout optreedt, zal de instructie “Exit Sub” die u vóór het label heeft, de procedure afsluiten zonder het foutlabel uit te voeren.
4. In geval van GoTo-fout -1
Voordat we hierop ingaan, wil ik eerst iets met u delen. Wanneer er een fout optreedt in een code, slaat VBA dit foutenlogboek op in zijn geheugen en wist het pas wanneer de routine is voltooid.
O VBA! Leef in het heden
Om de tweede fout in de VBA-code af te handelen, moet u de eerste fout uit het VBA-geheugen wissen. In de onderstaande code vindt u twee ‘On Error GoTo [Label]’-instructies die fouten uit twee verschillende codeblokken afhandelen.
Maar als u deze code uitvoert, springt VBA bij de tweede fout niet naar het label dat u hebt ingesteld, maar wordt in plaats daarvan het foutbericht “Type Mismatch” weergegeven.
Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Om dit probleem op te lossen, kunt u “On Error GoTo -1” gebruiken, waarmee VBA de huidige fout uit de opslag kan verwijderen.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Wanneer u nu deze code uitvoert, verwijdert “On Error GoTo -1” de fout uit het geheugen en verwerkt VBA de fout in de tweede instructie zoals gewenst.
Wat moet ik nog meer weten om fouten in VBA af te handelen?
Naast het gebruik van foutafhandelingstechnieken zijn er nog een paar andere dingen die u kunt gebruiken om fouten beter af te handelen.
Objectfout
Wanneer er een fout is opgetreden tijdens het uitvoeren van de code, kunt u het Err-object gebruiken om details over de fout te verkrijgen. Er zijn een aantal eigenschappen en methoden die u kunt gebruiken met het Err-object. Laten we ze één voor één leren.
Eigenschappen
Dit zijn de eigenschappen die u kunt gebruiken met het Err-object:
- Err.Number : Wanneer er een fout is opgetreden, wordt een nummer opgeslagen in het Err-object. In de onderstaande code wordt, wanneer deze optreedt, het foutnummer weergegeven in het berichtvenster.
- Err.Description : Deze eigenschap geeft de foutbeschrijving weer, zodat u de reden voor de fout kunt begrijpen.
- Err.Source: Deze eigenschap vertelt u in welk project de fout is opgetreden.
- Err.HelpContext: Deze eigenschap retourneert de Help-context-ID voor de fout in het Help-bestand.
- Err.HelpContext: Dit is een tekenreekswaarde voor de locatie van het Help-bestand.
Wanneer u fouten afhandelt met behulp van foutafhandelingstechnieken, gebruikt u normaal gesproken het Err-object niet veel in uw codes. Maar hieronder is een eenvoudig voorbeeld om het te gebruiken.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1: MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description End Sub
Wanneer u de bovenstaande code uitvoert en er een fout is opgetreden, wordt er een berichtvenster weergegeven met het foutnummer en de foutbeschrijving.
Methoden
Met Err Object kunt u ook twee methoden gebruiken.
- Err.Clear: Deze methode wist het foutnummer en de foutbeschrijving uit het VBA-geheugen (dit verschilt van “On Error GoTo -1” omdat de fout niet volledig wordt gereset).
- Err.Raise: Met deze methode kunt u opzettelijk een runtime-fout in uw code genereren , en hier is de syntaxis die u moet volgen:
Err . Verhoog [nummer], [bron], [beschrijving], [helpbestand], [helpcontext]
Snelle tips voor foutafhandeling
Hier volgen enkele snelle tips die u kunt gebruiken om VBA-fouten beter af te handelen.
- Gebruik “Bij fout hervatten volgende” alleen als u zeker weet dat er een fout optreedt en het acceptabel is om de coderegel met een fout over te slaan en veilig door te gaan naar de volgende regel.
- De beste manier om met runtime-fouten om te gaan, is door “Error Handler” te gebruiken met “On Error GoTo [Label]”. Dit zorgt ervoor dat wanneer de fout optreedt, u hiervan op de hoogte wordt gesteld, maar dat de vervelende foutmelding niet wordt weergegeven.
- Elke keer dat u de foutafhandelaar gebruikt, zorg ervoor dat u eerst “Exit Sub” gebruikt.