excel-vba
Debugging und Fehlerbehebung
Suche…
Syntax
- Debug.Print (Zeichenfolge)
- Halt halt
Debug.Print
Um eine Liste der Fehlercode-Beschreibungen an das Debug.Print
zu drucken, übergeben Sie sie an die Debug.Print
Funktion:
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
Sie können das Direktfenster anzeigen, indem Sie:
- Auswählen von V iew | Ich verwende Fenster aus der Menüleiste
- Verwenden der Tastenkombination Strg-G
Halt
Der Befehl Stop unterbricht die Ausführung, wenn er aufgerufen wird. Von dort kann der Prozess fortgesetzt oder schrittweise ausgeführt werden.
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
Sofortiges Fenster
Wenn Sie eine Zeile mit Makrocode testen möchten, ohne ein komplettes Sub-Element ausführen zu müssen, können Sie Befehle direkt in das ENTER
eingeben und die ENTER
, um die Zeile auszuführen.
Um die Ausgabe einer Zeile zu testen, können Sie ihr ein Fragezeichen voranstellen ?
um direkt in das Direktfenster zu drucken. Alternativ können Sie auch den print
, um die Ausgabe drucken zu lassen.
Drücken Sie in dem Visual Basic-Editor CTRL + G
, um das CTRL + G
zu öffnen. So benennen Sie Ihre aktuell ausgewählte Blatt „ExampleSheet“, geben Sie Folgendes in das Direktfenster ein und drücken ENTER
ActiveSheet.Name = "ExampleSheet"
So drucken Sie den Namen des aktuell ausgewählten Blatts direkt im Direktfenster
? ActiveSheet.Name
ExampleSheet
Diese Methode kann sehr nützlich sein, um die Funktionalität von integrierten oder benutzerdefinierten Funktionen zu testen, bevor sie in Code implementiert werden. Das folgende Beispiel veranschaulicht, wie das Direktfenster verwendet werden kann, um die Ausgabe einer Funktion oder einer Reihe von Funktionen zu testen, um ein erwartetes Ergebnis zu bestätigen.
'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
Das Direktfenster kann auch zum Festlegen oder Zurücksetzen von Application, Workbook oder anderen erforderlichen Eigenschaften verwendet werden. Dies kann nützlich sein, wenn sich in einer Subroutine Application.EnableEvents = False
, die unerwartet einen Fehler auslöst, ohne dass der Wert auf True
(was frustrierende und unerwartete Funktionen verursachen kann. In diesem Fall können die Befehle direkt eingegeben werden in das Direktfenster und starte:
? 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
Für fortgeschrittenere Debugging-Techniken kann ein Doppelpunkt :
als Trennzeichen verwendet werden. Dies kann für mehrzeilige Ausdrücke verwendet werden, z. B. für das Schleifen im folgenden Beispiel.
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
Verwenden Sie den Timer, um Engpässe in der Leistung zu finden
Der erste Schritt bei der Optimierung der Geschwindigkeit besteht darin, die langsamsten Codeabschnitte zu finden. Die Timer
VBA-Funktion gibt die Anzahl der seit Mitternacht verstrichenen Sekunden mit einer Genauigkeit von 1/56 Sekunde (3,90625 Millisekunden) auf Windows-basierten PCs zurück. Die VBA-Funktionen Now
und Time
sind nur auf eine Sekunde genau.
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"
Einen Haltepunkt zu Ihrem Code hinzufügen
Sie können Ihrem Code einfach einen Haltepunkt hinzufügen, indem Sie auf die graue Spalte links neben der Zeile Ihres VBA-Codes klicken, an der die Ausführung angehalten werden soll. In der Spalte wird ein roter Punkt angezeigt, und der Haltepunktcode wird ebenfalls rot hervorgehoben.
Sie können im gesamten Code mehrere Haltepunkte hinzufügen. Die Fortsetzung der Ausführung wird durch Drücken des Symbols "Wiedergabe" in der Menüleiste erreicht. Nicht jeder Code kann ein Haltepunkt als Variablendefinitionszeile sein, die erste oder letzte Zeile einer Prozedur und Kommentarzeilen können nicht als Haltepunkt ausgewählt werden.
Debugger-Fenster "Locals"
Das Fenster "Locals" bietet einen einfachen Zugriff auf den aktuellen Wert von Variablen und Objekten im Rahmen der Funktion oder Subroutine, die Sie ausführen. Es ist ein unverzichtbares Werkzeug, um Ihren Code zu debuggen und Änderungen durchzugehen, um Probleme zu finden. Sie können damit auch Eigenschaften erkunden, die Sie möglicherweise nicht kennen.
Nehmen Sie das folgende Beispiel:
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
Klicken Sie im VBA-Editor auf Ansicht -> Lokalfenster
Nachdem wir den Code mit F8 durchlaufen haben, nachdem wir in die Subroutine geklickt haben, haben wir angehalten, bevor wir findMeinLocals zuweisen konnten. Unten sehen Sie den Wert 0 - und dies würde verwendet werden, wenn Sie ihm niemals einen Wert zugewiesen hätten. Das Bereichsobjekt lautet 'Nothing'.
Wenn wir kurz vor dem Ende der Subroutine anhalten, können wir die endgültigen Werte der Variablen sehen.
Wir können findMeInLocals mit dem Wert 1 und den Typ Integer sowie FindMeInLocals2 mit einem Typ von Range / Range sehen. Wenn Sie auf das Pluszeichen klicken, können Sie das Objekt erweitern und seine Eigenschaften anzeigen, wie z. B. Anzahl oder Spalte.