Wenn wir in VBA einen Vorgang mehr als einmal durchführen wollen, verwenden wir dazu eine sogenannte Schleife. Davon gibt es verschiedene Arten: Einige, wie die “For…Next”-Schleife und die “For Each”-Schleife, werden entsprechend einer vorgegebenen Anzahl durchlaufen, andere solange, wie eine bestimmte Bedingung erfüllt ist – so zum Beispiel die “Do While”-Schleife. Dieser Artikel stellt die verschiedenen Schleifenarten vor und zeigt, welche sich für welchen Einsatzzweck eignet.
Schleifen
Grundsätzlich sind Schleifen Code-Konstrukte und ähneln vom Aufbau her den VBA-Routinen. Sie besitzen einen Schleifenkopf und eine abschließende Anweisung, die allerdings in diesem Fall nur das Ende eines Durchlaufs der Anweisungen innerhalb der Schleife bedeutet. Innerhalb der Schleife werden Anweisungen ausgeführt, solange die Bedingungen für das Fortsetzen der Schleife erfüllt sind. Diese Bedingungen können auf verschiedene Arten aufgebaut sein.
Unter VBA kennen wir die folgenden Schleifentypen:
- For…Next-Schleife: Diese Schleife hat eine Laufvariable mit einem Zahlendatentyp sowie einen Start- und einen Endwert. Mit einer zusätzlichen Option können wir festlegen, dass nicht jeder, sondern nur jeder x-te Wert berücksichtigt wird oder auch dass die Werte in umgekehrter Reihenfolge durchlaufen werden.
- For Each-Schleife: Die For Each-Schleife durchläuft alle Elemente einer Auflistung. Dabei wird der Laufvariablen dieses Schleifentyps jeweils das aktuelle Element der Auflistung zugewiesen.
- Do While-Schleife: Diese Schleife wird solange durchlaufen, wie die angegebene Bedingung erfüllt ist. Dementsprechend haben die in der Schleife enthaltenen Anweisungen in der Regel Einfluss auf den als Bedingung angegebenen Ausdruck. Diese Schleife gibt es in zwei Ausführungen – mit der Abbruchbedingung in der ersten und in der letzten Zeile.
- Do Until-Schleife: Im Gegensatz zur Do While-Schleife, die solange durchlaufen wird, wie die Bedingung erfüllt ist, läuft die Do Until-Schleife solange, bis die Bedingung erfüllt ist. Auch die Do Until-Schleife gibt es in zwei Ausführungen, von denen die eine die Bedingung in der ersten Zeile prüft und die andere in der letzten Zeile.
Beispiele
Die ersten Beispiele zu diesem Artikel findest Du in in der Excel-Datei VBABasics_Schleifen.xlsm oder in der Access-Datenbank VBABasics_Schleifen.accdb.
For…Next-Schleife
Die For…Next-Schleife zeichnet sich dadurch aus, dass zu Beginn festgelegt wird, wie oft die enthaltenen Anweisungen durchlaufen werden.
Um nachzuhalten, wie oft die Anweisungen innerhalb der Schleife bereits durchlaufen wurden, wird eine sogenannte Laufvariable verwendet, die meistens i genannt wird. Für diese Variable legt man einen Zahlendatentyp wie Integer oder Long fest. Wenn Du den Typ Integer wählst, musst Du den recht kleinen Wertebereich von -32.768 bis 32.767 beachten.
Die erste Zeile der For…Next-Schleife enthält außerdem noch den ersten und den letzten Wert sowie gegegebenfalls eine Schrittweite. Die Standardschrittweite lautet 1. Man gibt nur in Ausnahmefällen eine alternative Schrittweite an – dazu später mehr.
Die letzte Zeile einer For…Next-Schleife enthält lediglich das Next-Schlüsselwort und optional den Namen der Laufvariablen. Insgesamt sieht eine For…Next-Schleife, die beispielsweise mit den Werten von 1 bis 10 für die Variable i durchlaufen werden soll, wie folgt aus:
Dim i As Integer For i = 1 To 10 Debug.Print i Next i
Innerhalb der For…Next-Schleife wird der Wert von i im Direktfenster ausgeben. Dort erscheinen beim Aufrufen der Prozedur ForNext_Einfach des Moduls mdlBeispieleSchleifen der Beispieldatenbank also die Zahlen von 1 bis 10. Der Ablauf der For…Next-Schleife wird auch vom Flussdiagramm in Bild 1 skizziert. Die Schleife startet mit dem Wert 1 für die Variable i.
Bild 1: Diagramm für den Ablauf einer einfachen For…Next-Schleife
Enthält i einen Wert kleiner oder gleich dem Endwert der Schleife, werden die Anweisungen des Schleifenkörpers ausgeführt und i um eins erhöht.
Monate ausgeben
Die Laufvariable können wir gleich sinnvoll nutzen. Das folgende Beispiel durchläuft etwa die Zahlen von 1 bis 12 und gibt die entsprechenden Monatsnamen aus:
Dim i As Integer For i = 1 To 12 Debug.Print Format("1." & i & "." & Year(Date), _ "mmmm") Next i
Schrittweite mit Step einstellen
Der For…-Zeile können wir noch das Schlüsselwort Step mit der gewünschten Schrittweite hinzufügen.
Wenn wir die Zahlen von 10 bis 1 rückwärts durchlaufen möchten, geben wir als Startwert 10, als Endwert 1 und für Step den Wert -1 an:
Dim i As Integer For i = 10 To 1 Step -1 Debug.Print i Next i
Exit For
Gelegentlich werden wir eine For…Next-Schleife vorzeitig verlassen wollen. In diesem Fall können wir die Exit For-Anweisung verwenden:
Dim i As Integer For i = 1 To 10 Debug.Print i If i = 5 Then Exit For End If Next i
Verschachtelte Schleifen
Möglicherweise möchten wir einmal zwei oder mehr verschachtelte Schleifen verwenden. Dazu benötigen wir entsprechend viele Laufvariablen, im folgenden Beispiel i und j:
Dim i As Integer Dim j As Integer For i = 1 To 5 For j = 1 To 5 Debug.Print "(" & j & "," & i & ")", Next j Debug.Print Next i
Die obigen Schleifen geben eine Zahlenmatrix wie in Bild 2 aus. Damit jeweils fünf Einträge nebeneinander ausgegeben werden, beenden wir die Debug.Print-Anweisung der inneren Schleife mit dem Komma-Zeichen.
Bild 2: Ausgabe einer Zahlenmatrix mit zwei verschachtelten Schleifen
Dies bedeutet, dass die folgende Debug.Print-Anweisung in die gleiche Zeile drucken soll – und zwar mit einem Tabulator-Schritt als Abstand.
Wir können auch das Semikolon als letztes Zeichen angeben. Die Ausgabe wird dann unmittelbar hinter dem letzten Zeichen fortgesetzt.
Damit die Ausgabe nach fünf Elementen in der folgenden Zeile fortgesetzt wird, ruft die Prozedur nach der Abarbeitung der inneren Schleife eine Debug.Print-Anweisung ohne auszugebenden Text auf.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: