Debugging im VBA-Editor, Teil 2

Nachdem Sie im ersten Teil dieser Artikelreihe einige codebasierten Debugging-Techniken kennengelernt haben, schauen wir uns in diesem Teil weitere VBA-gesteuerte Features an. Außerdem werfen wir einen Blick auf die Tools, die der VBA-Editor uns zum Debuggen bietet. Dazu gehören beispielsweise das Lokalfenster und die überwachungen.

Anhalten bei bestimmtem Wert

Wenn Sie eine Stelle im Code zur Laufzeit untersuchen möchten, fügen Sie dort entweder einen Haltepunkt oder die Stop-Anweisung ein. Beides hält den Code bei jedem Erreichen der entsprechenden Stelle an.

Manchmal wird die betroffene Codestelle jedoch sehr oft durchlaufen, sodass der Code entsprechend oft angehalten und beispielsweise die Variablen untersucht werden müssen. In vielen Fällen wissen Sie jedoch, dass ein Problem nur unter bestimmten Bedingungen auftaucht. So könnte es sein, dass Sie in einer Schleife alle Datensätze der Tabelle tblArtikel durchlaufen, aber schon wissen, dass ein Problem nur bei einem bestimmten Datensatz auftaucht.

Wenn Sie wissen, dass ein Problem immer in Zusammenhang mit dem Datensatz mit dem Wert 20 im Feld ArtikelID auftaucht, können Sie gezielt einen Haltepunkt setzen. Damit dieser auch nur für den betroffenen Datensatz erreicht wird, fassen Sie diesen in eine entsprechende If…Then-Bedingung ein. Dies sieht beispielsweise wie in Bild 1 aus, wobei die Bedingung rst!ArtikelID = 20 lautet. Nur wenn diese Bedingung erfüllt ist, wird die innerhalb der If…Then-Bedingung enthaltene und mit einem Haltepunkt versehene Anweisung erreicht. Nun können Sie beispielsweise weitere Werte des aktuellen Datensatzes im Direktfenster ausgeben – etwa so:

Anhalten des Codes bei Erreichen eines bestimmten Wertes

Bild 1: Anhalten des Codes bei Erreichen eines bestimmten Wertes

Debug.Print rst!Artikelbestand

Haltepunkt per Assert

Die Debug-Klasse bietet neben der Print-Methode noch eine weitere, relativ unbekannte Methode. Diese heißt Assert und erwartet einen Ausdruck als Parameter, der entweder den Wert True oder False zurückliefert. Wenn der Ausdruck den Wert False zurückgibt, hält die Prozedur automatisch in der Zeile mit der Debug.Assert-Anweisung an.

Im Gegensatz zum vorherigen Beispiel, wo die Debug.Print mit dem Haltepunkt genau beim Eintreten der gewünschten Bedingung ausgelöst wird, müssen Sie bei Debug.Assert also genau dem umgekehrten Fall formulieren.

Auf jeden Fall brauchen Sie mit Debug.Assert nur eine statt drei Zeilen, um den Code beim Eintreten der gewünschten Bedingung anzuhalten:

Public Sub GezielterHaltepunkt_II()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Set rst = db.OpenRecordset( _
         "SELECT * FROM tblArtikel", dbOpenDynaset)
     Do While Not rst.EOF
         Debug.Assert Not (rst!ArtikelID = 20)
         rst.MoveNext
     Loop
End Sub

Sie müssen lediglich beachten, dass Sie den Ausdruck durch Voranstellen des Schlüsselworts Not ins Gegenteil umkehren.

Das Lokal-Fenster

Wenn Sie eine Prozedur per Einzelschritt durchlaufen oder diese an der gewünschten Stelle auf eine der oben angegebenen Arten angehalten haben, wissen Sie in vielen Fällen noch nicht, wonach Sie suchen müssen. Da hilft es oft, sich einfach einmal einen überblick über die aktuellen Werte aller derzeit verwendeten Variablen zu verschaffen.

Dabei ist das Lokal-Fenster eine große Hilfe. Sie blenden es mit dem Menübefehl Ansicht|Lokal-Fenster ein. Wenn aktuell kein Code durchlaufen wird, ist das Fenster leer. Deshalb schauen wir uns nun an, was das Lokalfenster beim Durchlaufen der Prozedur GezielterHaltepunkt_II tut.

Lassen wir die Prozedur ruhig genau an der mit Debug.Assert festgelegten Position anhalten, indem wir die Einfügemarke an beliebiger Stelle innerhalb der Prozedur platzieren und dann auf F5 drücken.

Wie Bild 2 zeigt, geschieht in der Prozedur doch mehr als erwartet – es gibt mehr Variablen als gedacht. Das liegt daran, dass die beiden in der Prozedur verwendeten Objektvariablen db und rst jeweils auf Objekte verweisen, die eine ganze Reihe von Eigenschaften enthalten. Im Lokal-Fenster können Sie all diese Werte zum aktuellen Zeitpunkt prüfen. Sie brauchen also nicht jede Eigenschaft mit Debug.Print im Direktbereich auszugeben, sondern können die Eigenschaften im Lokal-Fenster verfolgen.

Das Lokal-Fenster liefert eine Reihe Informationen.

Bild 2: Das Lokal-Fenster liefert eine Reihe Informationen.

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar