Die VBA-With-Anweisung

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Unter den Elementen, die den Programm-Code unter VBA strukturierter erscheinen lassen, findet die With-Anweisung oft wenig Berücksichtigung. Dabei spart man mit ihr nicht nur Programmtext ein, sondern erleichtert sich über IntelliSense zusätzlich das Schreiben von Objektmethoden.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1501_WithAnweisung.mdb.

Grundlegende Syntax

Die With-Anweisung stellt einen Bezug zu einer Variablen her, der entweder ein benutzerdefinierter Datentyp (UDT) zugrunde liegt, oder ein Objekt. Ob diese in ihren eigenen Modulen deklariert sind, oder in einer Verweisbibliothek, spielt dabei keine Rolle. Die Blockanweisung besteht aus zwei Elementen, dem Blockstart und dem Blockende:

Dim Variable As ...
With [Variable]  'Blockstart
.[Methode oder]
.[Eigenschaft] = ...
End With  'Blockende

Nach dem reservierten Wort With folgt der Name einer Variablen, auf die sich die Methoden, Eigenschaften oder Typelemente im Folgenden beziehen sollen.

Wird in einer Prozedur die Variable nicht mehr weiter benötigt, so schließt man den Bezug mit der Anweisung End With.

With im Einsatz

Einen Code aus dem wahren Datenbankprogrammiererleben finden Sie im Listing 1 der Beispieldatenbank, wo auf eine Tabelle tblTest eine Datensatzgruppe (Recordset) geöffnet wird, um sie mit Datensätzen zu füllen und jene anschließend im VBA-Direktfenster auszugeben. In der ersten Zeile der Routine wird die Tabelle zunächst mit einer SQL-Anweisung per Database.Execute geleert. Dann erfolgt das Setzen des Recordsets rsTest auf die Tabelle. Die Recordset-Variable rsTest wurde übrigens bereits im Modulkopf deklariert, ebenso die Zählervariable i:

Sub OhneWITH()
     CurrentDb.Execute "DELETE * FROM tblTest"
     Set rsTest = CurrentDb.OpenRecordset("SELECT * FROM tblTest", dbOpenDynaset)
     For i = 1 To 100
         rsTest.AddNew
         rsTest!ID = i
         rsTest!Code = Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd)
         rsTest.Update
     Next i
     
     rsTest.MoveFirst
     Do While Not rsTest.EOF
         Debug.Print rsTest!ID, rsTest!Code
         rsTest.MoveNext
     Loop
     rsTest.Close
End Sub

Listing 1: Durchlaufen der Datensätze einer Tabelle

Private rsTest As DAO.Recordset
Private i As Long

Im weiteren Verlauf werden in einer Schleife auf den Zähler i der Tabelle hundert Datensätze hinzugefügt, wobei für das Feld Code jeweils ein dreistelliger zufälliger Buchstabencode generiert wird. Zum Schluss werden alle Datensatzinhalte wieder in einer Schleife über Debug.Print in das VBA-Direktfenster ausgegeben. Das Ergebnis wäre etwa dieses:

  1            J\Q
  2            PEZ
  3            BWU
  4            H[N
  5            ULG
...

Auffallend ist, dass der Variablenname rsTest sehr häufig in der Routine auftaucht. Genau dies lässt sich mit der With-Anweisung umgehen, indem zum Blockstart der Verweis auf rsTest gesetzt wird und im Folgenden darauf nur noch indirekt Bezug genommen wird. Der abgewandelte Code steht in Listing 2.

Sub MitWITH()
     CurrentDb.Execute "DELETE * FROM tblTest"
     Set rsTest = CurrentDb.OpenRecordset("SELECT * FROM tblTest", dbOpenDynaset)
     With rsTest
         For i = 1 To 100
             .AddNew
             !ID = i
             !Code = Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd)
             .Update
         Next i
         .MoveFirst
         Do While Not .EOF
             Debug.Print !ID, !Code
             .MoveNext
         Loop
         .Close
     End With
End Sub

Listing 2: Der gleiche Code unter Einsatz der With-Anweisung

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar