excel-vba
Foutopsporing en probleemoplossing
Zoeken…
Syntaxis
- Debug.Print (string)
- Stop Stop
Debug.Print
Om een lijst van de beschrijvingen van de foutcodes naar het directe venster af te drukken, geeft u dit door aan de functie Debug.Print
:
Private Sub ListErrCodes()
Debug.Print "List Error Code Descriptions"
For i = 0 To 65535
e = Error(i)
If e <> "Application-defined or object-defined error" Then Debug.Print i & ": " & e
Next i
End Sub
U kunt het directe venster weergeven door:
- V iew | selecteren Ik regel Windows vanuit de menubalk
- Gebruik de sneltoets Ctrl-G
Hou op
De opdracht Stop onderbreekt de uitvoering wanneer deze wordt aangeroepen. Vanaf daar kan het proces worden hervat of stap voor stap worden uitgevoerd.
Sub Test()
Dim TestVar as String
TestVar = "Hello World"
Stop 'Sub will be executed to this point and then wait for the user
MsgBox TestVar
End Sub
Direct venster
Als u een regel macrocode wilt testen zonder een hele sub uit te voeren, kunt u opdrachten rechtstreeks in het venster Direct typen en op ENTER
om de regel uit te voeren.
Om de uitvoer van een lijn te testen, kunt u deze voorafgaan met een vraagteken ?
om rechtstreeks naar het directe venster af te drukken. Als alternatief kunt u ook de print
gebruiken om de uitvoer af te drukken.
Druk in Visual Basic Editor op CTRL + G
om het venster Direct te openen. Om uw huidig geselecteerde blad te hernoemen naar "Voorbeeldblad", typt u het volgende in het venster Direct en drukt u op ENTER
ActiveSheet.Name = "ExampleSheet"
Om de naam van het huidig geselecteerde blad rechtstreeks in het venster Direct af te drukken
? ActiveSheet.Name
ExampleSheet
Deze methode kan erg handig zijn om de functionaliteit van ingebouwde of door de gebruiker gedefinieerde functies te testen voordat ze in code worden geïmplementeerd. Het onderstaande voorbeeld laat zien hoe het venster Direct kan worden gebruikt om de uitvoer van een functie of een reeks functies te testen om een verwachte te bevestigen.
'In this example, the Immediate Window was used to confirm that a series of Left and Right
'string methods would return the desired string
'expected output: "value"
print Left(Right("1111value1111",9),5) ' <---- written code here, ENTER pressed
value ' <---- output
Het directe venster kan ook worden gebruikt om de toepassing, werkmap of andere benodigde eigenschappen in te stellen of opnieuw in te stellen. Dit kan handig zijn als u Application.EnableEvents = False
in een subroutine die onverwacht een fout veroorzaakt, waardoor deze wordt gesloten zonder de waarde op True
te resetten (wat frustrerend en onverwachte functionaliteit kan veroorzaken. In dat geval kunnen de opdrachten direct worden getypt naar het directe venster en voer uit:
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
False ' <---- Output
Application.EnableEvents = True ' <---- Resetting the property value to True
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
True ' <---- Output
Voor meer geavanceerde foutopsporingstechnieken kan een dubbele punt :
worden gebruikt als scheidingsteken voor regels. Dit kan worden gebruikt voor expressies met meerdere regels zoals looping in het onderstaande voorbeeld.
x = Split("a,b,c",","): For i = LBound(x,1) to UBound(x,1): Debug.Print x(i): Next i '<----Input this and press enter
a '<----Output
b '<----Output
c '<----Output
Gebruik de timer om knelpunten in prestaties te vinden
De eerste stap bij het optimaliseren voor snelheid is het vinden van de langzaamste delen van code. De Timer
VBA-functie retourneert het aantal seconden dat is verstreken sinds middernacht met een precisie van 1 / 256ste van een seconde (3.90625 milliseconden) op pc's met Windows. De VBA-functies Now
en Time
zijn slechts tot op de seconde nauwkeurig.
Dim start As Double ' Timer returns Single, but converting to Double to avoid
start = Timer ' scientific notation like 3.90625E-03 in the Immediate window
' ... part of the code
Debug.Print Timer - start; "seconds in part 1"
start = Timer
' ... another part of the code
Debug.Print Timer - start; "seconds in part 2"
Een breekpunt toevoegen aan uw code
U kunt eenvoudig een breekpunt toevoegen aan uw code door op de grijze kolom links van de regel van uw VBA-code te klikken waar u wilt dat de uitvoering stopt. Er verschijnt een rode stip in de kolom en de breekpuntcode is ook rood gemarkeerd.
U kunt meerdere breekpunten toevoegen in uw code en de uitvoering wordt hervat door op het pictogram 'spelen' in uw menubalk te drukken. Niet alle code kan een breekpunt zijn als variabele definitielijnen, de eerste of laatste regel van een procedure en commentaarregels kunnen niet als breekpunt worden geselecteerd.
Debugger Locals-venster
Het venster Locals biedt eenvoudige toegang tot de huidige waarde van variabelen en objecten binnen het bereik van de functie of subroutine die u uitvoert. Het is een essentieel hulpmiddel voor het opsporen van fouten in uw code en het doorlopen van wijzigingen om problemen te vinden. Hiermee kunt u ook eigenschappen verkennen waarvan u nog niet wist dat ze bestonden.
Neem het volgende voorbeeld,
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
Klik in de VBA-editor op Beeld -> Lokaal venster
Door vervolgens door de code te bladeren met behulp van F8 nadat we in de subroutine hebben geklikt, zijn we gestopt voordat we findMeinLocals toewijzen. Hieronder zie je dat de waarde 0 is --- en dit zou worden gebruikt als je er nooit een waarde aan zou toewijzen. Het bereikobject is 'Niets'.
Als we stoppen vlak voordat de subroutine eindigt, kunnen we de definitieve waarden van de variabelen zien.
We kunnen findMeInLocals zien met een waarde van 1 en het type Integer, en FindMeInLocals2 met een type Bereik / Bereik. Als we op het + -teken klikken, kunnen we het object uitbreiden en de eigenschappen ervan bekijken, zoals aantal of kolom.