VBA bij fout - Best practices voor foutafhandeling

Cheatsheet voor VBA-fouten

fouten

BeschrijvingVBA-codeOn Error - Stopcode en weergavefoutBij fout Ga naar 0Bij fout - Fout overslaan en doorgaan met draaienBij fout Hervatten volgendeBij fout - Ga naar een regel code [Label]Bij fout Ga naar [Label]Wist (reset) foutBij fout Ga naar -1Toon foutnummerMsgBox Err.NummerToon beschrijving van de foutMsgBox Err.BeschrijvingFunctie om eigen fout te genererenErr.Verhogen

Bekijk meer VBA "spiekbriefjes" en gratis pdf-downloads

VBA-foutafhandeling

VBA-foutafhandeling verwijst naar het proces van anticiperen, detecteren en oplossen van VBA-runtimefouten. Het VBA-foutafhandelingsproces vindt plaats bij het schrijven van code, voordat er daadwerkelijk fouten optreden.

VBA-runtimefouten zijn fouten die optreden tijdens het uitvoeren van code. Voorbeelden van runtime-fouten zijn:

  • Verwijzen naar een niet-bestaande werkmap, werkblad of ander object
  • Ongeldige gegevens bijv. verwijzen naar een Excel-cel die een fout bevat
  • Poging om te delen door nul

VBA bij foutverklaring

De meeste VBA-foutafhandeling wordt gedaan met de Op foutverklaring. De instructie On Error vertelt VBA wat te doen als er een fout optreedt. Er zijn er drie Op foutverklaringen:

  • Bij fout Ga naar 0
  • Bij fout Hervatten volgende
  • Bij fout Ga naar Lijn

Bij fout Ga naar 0

Bij fout Ga naar 0 is de standaardinstelling van VBA. U kunt deze standaardinstelling herstellen door de volgende regel code toe te voegen:

1 Bij fout Ga naar 0

Wanneer er een fout optreedt met Bij fout Ga naar 0, zal VBA stoppen met het uitvoeren van code en het standaard foutberichtvenster weergeven.

Vaak voeg je een toe Bij fout Ga naar 0 na het toevoegen Bij fout Hervatten volgende foutafhandeling (volgende sectie):

123456789 SubfoutGoTo0()Bij fout Hervatten volgendeActiveSheet.Shapes ("Start_Button").VerwijderenBij fout Ga naar 0'Voer meer code uit'Einde sub

Bij fout Hervatten volgende

Bij fout Hervatten volgende vertelt VBA om alle coderegels met fouten over te slaan en door te gaan naar de volgende regel.

1 Bij fout Hervatten volgende

Opmerking: Bij fout Hervatten volgende lost een fout niet op of lost deze op een andere manier op. Het vertelt VBA eenvoudigweg om door te gaan alsof de coderegel die de fout bevat niet bestaat. Onjuist gebruik van Bij fout Hervatten volgende kan leiden tot onbedoelde gevolgen.

Een geweldige tijd om te gebruiken Bij fout Hervatten volgende is bij het werken met objecten die al dan niet bestaan. U wilt bijvoorbeeld code schrijven die een vorm verwijdert, maar als u de code uitvoert terwijl de vorm al is verwijderd, geeft VBA een fout. In plaats daarvan kunt u gebruik maken van Bij fout Hervatten volgende om VBA te vertellen de vorm te verwijderen als deze bestaat.

123 Bij fout Hervatten volgendeActiveSheet.Shapes ("Start_Button").VerwijderenBij fout Ga naar 0

Merk op dat we hebben toegevoegd Bij fout Ga naar 0 na de regel code die de mogelijke fout bevat. Hiermee wordt de foutafhandeling gereset.

In het volgende gedeelte laten we u zien hoe u kunt testen of er een fout is opgetreden met Foutnummer, waardoor u meer geavanceerde opties voor foutafhandeling krijgt…

Err.Number, Err.Clear en fouten opvangen

In plaats van simpelweg een regel met een fout over te slaan, kunnen we de fout opvangen door . te gebruiken Bij fout Hervatten volgende en Foutnummer.

Foutnummer geeft een foutnummer terug dat overeenkomt met het type fout dat is gedetecteerd. Als er geen fout is, Foutnummer = 0.

Deze procedure retourneert bijvoorbeeld "11" omdat de fout die optreedt is: Runtime-fout '11'.

1234567 Sub ErrorNumber_ex()Bij fout Hervatten volgendeActiveCell.Waarde = 2 / 0MsgBox Err.NummerEinde sub

Foutafhandeling met Err.Number

De ware kracht van Foutnummer ligt in het vermogen om te detecteren of er een fout is opgetreden (Foutnummer 0). In het onderstaande voorbeeld hebben we een functie gemaakt die test of een blad bestaat met behulp van Err.Number.

12345678910111213141516171819 SubtestWS()MsgBox DoetWSExist("test")Einde subFunctie DoesWSExist(wsName As String) As BooleanDim ws als werkbladBij fout Hervatten volgendeStel ws = Bladen in (wsName)'Als fout WS niet bestaat'Als Foutnummer 0 DanDoesWSExist = FalseAndersIsWSExist = TrueStop alsBij fout Ga naar -1Functie beëindigen

Opmerking: we hebben een . toegevoegd Bij fout Ga naar -1 tot het einde waardoor Err.Number op 0 wordt gezet (zie twee secties verderop).

Met Bij fout Hervatten volgende en Foutnummer, kunt u de repliceren "Proberen te vangen" functionaliteit van andere programmeertalen.

Bij fout Ga naar Lijn

Bij fout Ga naar Lijn vertelt VBA om naar een gelabelde regel code te "gaan" wanneer er een fout wordt aangetroffen. U declareert de Go To-instructie als volgt (waarbij errHandler het regellabel is waarnaar u moet gaan):

1 Bij fout Ga naar errHandler

en maak een lijnlabel als volgt:

1 errHandler:

Opmerking: dit is hetzelfde label dat u zou gebruiken met een gewone VBA GoTo-verklaring.

Hieronder zullen we demonstreren met behulp van: Bij fout Ga naar Lijn om een ​​procedure af te sluiten.

Bij fout Sub afsluiten

U kunt On Error GoTo Line gebruiken om een ​​sub te verlaten wanneer er een fout optreedt.

U kunt dit doen door het regellabel van de foutafhandeling aan het einde van uw procedure te plaatsen:

12345678 Sub ErrGoToEnd()Bij Fout GoTo endProc'Enkele code'endProc:Einde sub

of door de opdracht Exit Sub te gebruiken:

123456789101112131415 Sub ErrGoToEnd()Bij Fout GoTo endProc'Enkele code'GaNaar overslaanAfsluitenendProc:Sluit suboverslaanExit:'Nog meer code'Einde sub

Err.Clear, On Error GoTo -1 en Reset Err.Number

Nadat een fout is afgehandeld, moet u de fout over het algemeen wissen om toekomstige problemen met foutafhandeling te voorkomen.

Nadat er een fout is opgetreden, beide Err.Clear en Bij fout Ga naar -1 kan worden gebruikt om te resetten Foutnummer naar 0. Maar er is één heel belangrijk verschil: Err.Clear reset niet de eigenlijke fout zelf, het reset alleen de Foutnummer.

Wat betekent dat? Gebruik makend vanErr.Clear, kunt u de instelling voor foutafhandeling niet wijzigen. Test deze code en vervang deze om het verschil te zien Bij fout Ga naar -1 met Err.Clear:

123456789101112131415161718192021 Sub ErrExamples()Bij fout GoTo errHandler:'"Door toepassing gedefinieerde" foutFout (13)Sluit suberrHandler:' Fout wissenBij fout Ga naar -1Bij fout Ga naar errHandler2:'"Type komt niet overeen" foutFout (1034)Sluit suberrHandler2:Debug.Print Err.BeschrijvingEinde sub

Meestal raad ik aan om altijd te gebruiken Bij fout Ga naar -1, tenzij je een goede reden hebt om te gebruiken Err.Clear in plaats daarvan.

VBA bij fout MsgBox

Mogelijk wilt u ook een berichtvenster weergeven bij een fout. In dit voorbeeld worden verschillende berichtvensters weergegeven, afhankelijk van waar de fout zich voordoet:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx()Dim errMsg As StringBij fout Ga naar errHandler'Fase 1errMsg = "Er is een fout opgetreden tijdens het kopiëren en plakken."'Err.Verhogen (11)'Stage 2errMsg = "Er is een fout opgetreden tijdens de gegevensvalidatiefase."'Err.Verhogen (11)'Etage 3'errMsg = "Er is een fout opgetreden tijdens de P&L-Building en Copy-Over-fase."Err.Verhogen (11)'Etage 4'errMsg = "Er is een fout opgetreden bij het loggen van de import op de instellingenpagina"'Err.Verhogen (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Einde sub

Hier zou je Err.Raise (11) vervangen door je eigenlijke code.

VBA IsError

Een andere manier om met fouten om te gaan, is door ze te testen met de VBA IsError-functie. De functie IsError test een expressie op fouten en retourneert TRUE of FALSE als er een fout optreedt.

123 Sub IsErrorEx()MsgBox IsError(Bereik("a7").Waarde)Einde sub

Als fout VBA

U kunt ook fouten in VBA afhandelen met de Excel IfError-functie. De IfError-functie moet worden geopend met behulp van de WerkbladFunctieklasse:

1234567 Sub AlsErrorEx()Dim n As Longn = WerkbladFunctie.IfError(Bereik("a10").Waarde, 0)MsgBox nEinde sub

Hierdoor wordt de waarde van bereik A10 uitgevoerd, als de waarde een fout is, wordt in plaats daarvan 0 uitgevoerd.

VBA-fouttypen

Runtime-fouten

Zoals hierboven vermeld:

VBA-runtimefouten zijn fouten die optreden tijdens het uitvoeren van code. Voorbeelden van runtime-fouten zijn:

  • Verwijzen naar een niet-bestaande werkmap, werkblad of ander object
  • Ongeldige gegevens bijv. verwijzen naar een Excel-cel die een fout bevat
  • Poging om te delen door nul

U kunt runtime-fouten "afhandelen" met behulp van de hierboven besproken methoden.

Syntaxisfouten

VBA-syntaxisfouten zijn fouten bij het schrijven van code. Voorbeelden van syntaxisfouten zijn:

  • spelfout
  • Ontbrekende of onjuiste interpunctie

De VBA-editor identificeert veel syntaxisfouten met rode markering:

De VBA-editor heeft ook een optie voor "Automatische syntaxiscontrole":

Wanneer dit is aangevinkt, genereert de VBA-editor een berichtvenster waarin u wordt gewaarschuwd voor syntaxisfouten nadat u een regel code hebt ingevoerd:

Ik vind dit persoonlijk buitengewoon vervelend en schakel de functie uit.

Compileer fouten

Voordat u probeert een procedure uit te voeren, zal VBA de procedure "compileren". Compileren transformeert het programma van broncode (die u kunt zien) in uitvoerbare vorm (u kunt niet zien).

VBA-compileerfouten zijn fouten die voorkomen dat de code wordt gecompileerd.

Een goed voorbeeld van een compileerfout is een ontbrekende variabeledeclaratie:

Andere voorbeelden zijn:

  • Voor zonder Volgende
  • Selecteer zonder Einde Selecteren
  • Indien zonder Stop als
  • Bellen naar een procedure dat bestaat niet

Syntaxisfouten (vorige sectie) zijn een subset van compileerfouten.

Foutopsporing > Compileren

Er verschijnen compileerfouten wanneer u een procedure probeert uit te voeren. Maar idealiter zou u compileerfouten identificeren voordat u probeert de procedure uit te voeren.

U kunt dit doen door het project van tevoren samen te stellen. Ga hiervoor naar Foutopsporing > VBA-project compileren.

De compiler "gaat naar" de eerste fout. Zodra u die fout hebt verholpen, compileert u het project opnieuw. Herhaal totdat alle fouten zijn verholpen.

U kunt zien dat alle fouten zijn opgelost omdat: VBA-project compileren wordt grijs weergegeven:

Overloopfout

De VBA-overloopfout treedt op wanneer u probeert een waarde in een variabele te plaatsen die te groot is. Bijvoorbeeld, Integer-variabelen kan alleen waarden tussen -32.768 en 32.768 bevatten. Als u een grotere waarde invoert, ontvangt u een overloopfout:

In plaats daarvan moet u de gebruiken Lange variabele om het grotere nummer op te slaan.

Andere VBA-foutvoorwaarden

VBA-vangfout

In tegenstelling tot andere programmeertalen is er in VBA geen Vangstverklaring. U kunt een vangstverklaring echter repliceren door gebruik te maken van Bij fout Hervatten volgende en Als Foutnummer 0 Dan. Dit wordt hierboven behandeld in Foutafhandeling met Err.Number.

VBA Negeer Fout

Om fouten in VBA te negeren, gebruik je gewoon de Bij fout Hervatten volgende uitspraak:

1 Bij fout Hervatten volgende

Zoals hierboven vermeld, moet u echter voorzichtig zijn met het gebruik van deze verklaring, omdat deze geen fout oplost, maar gewoon de coderegel negeert die de fout bevat.

VBA Throw Error / Err.Raise

Om een ​​fout in VBA te omzeilen, gebruik je de Err.Verhogen methode.

Deze regel code zal Runtime-fout '13' oproepen: Type komt niet overeen:

1 Err.Verhogen (13)

VBA-fouttrapping

VBA-fouttrapping is gewoon een andere term voor VBA Error Handling.

VBA-foutmelding

EEN VBA-foutmelding het lijkt op dit:

Wanneer u op 'Debug' klikt, ziet u de coderegel die de fout veroorzaakt:

VBA-foutafhandeling in een lus

De beste manier om fouten binnen een lus af te handelen, is door gebruik te maken van Bij fout Hervatten volgende samen met Foutnummer om te detecteren of er een fout is opgetreden (vergeet niet om Err.Clear om de fout na elke gebeurtenis te wissen).

Het onderstaande voorbeeld deelt twee getallen (kolom A door kolom B) en voert het resultaat uit in kolom C. Als er een fout is, is het resultaat 0.

12345678910111213141516 Subtest()Dim cel als bereikBij fout Hervatten volgendeVoor elke cel binnen bereik ("a1:a10")'Stel celwaarde in'cel.Offset(0, 2).Waarde = cel.Waarde / cel.Offset(0, 1).Waarde'Als Cell.Value een fout is, is de standaardwaarde 0Als Foutnummer 0 Dancel.Offset(0, 2).Waarde = 0Err.ClearStop alsVolgendeEinde sub

VBA-foutafhandeling in Access

Alle bovenstaande voorbeelden werken in Access VBA precies hetzelfde als in Excel VBA.

123456789101112131415161718 Functie DelRecord (van As Form)'deze functie wordt gebruikt om een ​​record in een tabel uit een formulier te verwijderen'Bij fout Ga naar eindeMet frmAls .NieuweRecord Dan.Ongedaan makenFunctie verlatenStop alsEindigt metMet frm.RecordsetClone.Bladwijzer = frm.Bladwijzer.Verwijderenfrm.VerzoekEindigt metFunctie verlateneinde:EindeFunctie beëindigen

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

wave wave wave wave wave