Oft ist es sinnvoll, einen Programmabschnitt mehrfach ausführen zu lassen. Das nennt man eine „Schleife“.
Weiß man vorher, wie oft eine Schleife durchlaufen werden soll, kommt
For-Next
zum Einsatz:
Sub Schleife() Dim i As Long For i = 1 To 10 Debug.Print i Next End Sub
Diese Prozedur gibt die Zahlen von 1 bis 10 aus. Dafür wird zuerst eine Variable
namens i
deklariert, die in der For
-Schleife
den Startwert 1 erhält, und der Code bis Next
abgearbeitet. Danach wird dieser Code erneut abgearbeitet, aber i
vorher
um 1 erhöht. Das passiert so oft, bis i
den Endwert erreicht, der mit
To
angegeben wurde. Erst dann wird i
nicht weiter erhöht und der Code nach Next
fortgesetzt.
In der Praxis wird eine Erhöhung einer Schleife um je 1 wohl am häufigsten
benötigt. Mit Step
kann man aber auch andere
Schrittweiten angeben.
Sub weniger() Dim i As Double For i = 15 To 0 Step -1.5 Debug.Print i Next i End Sub
In dieser Sub wird i
In jedem Durchlauf um 1,5 kleiner.
In diesem Beispiel ist nach Next
nochmals
der Schleifenzähler i
angegeben. Das ist nicht notwendig, kann aber
den Code übersichtlicher machen, wenn z. B. mehrere Schleifen ineinander
geschachtelt werden.
Mit Do
-Schleifen kann man Programmabschnitte
wiederholen, solange eine Bedingung erfüllt ist. Solche Schleifen eignen sich, wenn
man nicht weiß, wie oft die Schleife durchlaufen werden soll.
Sub endlos() Dim start As Date, jetzt As Date Dim Schleife As Long start = Now Do While jetzt < start + TimeSerial(0, 0, 1) jetzt = Now Schleife = Schleife + 1 Loop Debug.Print "Schleife wurde " & Schleife & "mal durchlaufen" End Sub
Hier wird eine Schleife genau eine Sekunde lang immer wieder durchlaufen. Am
Ende wird ausgegeben, wie oft die Schleife durchlaufen wurde. Dazu wird erst die
Startzeit in start
gespeichert, und zwar mit der internen
Funktion Now
. Anschließend beginnt mit
Do
die Schleife, die aber nur ausgeführt wird,
solange jetzt
kleiner ist als start
plus eine Sekunde
(zur Berechnung der Sekunde dient die interne
Funktion TimeSerial
). Anfangs wurde jetzt
noch kein
Wert zugewiesen und ist daher 0, daher wird die Schleife ausgeführt. Erst in der
Schleife bekommt jetzt
einen Wert, mit dem dann vor dem nächsten
Schleifendurchgang verglichen wird.
Anstelle von While
kann man auch
Until
verwenden. Dann wird die Schleife nur
ausgeführt, solange die Bedingung nicht erfüllt ist. Und man kann auch
die Bedingung nicht nach Do
, sondern stattdessen
hinter Loop
einfügen. Dann wird die Schleife
auf jeden Fall mindestens einmal durchlaufen.
Sub endtest() Dim Bedingung As Boolean Dim i As Long Bedingung = True Do i = i + 1 Debug.Print i Loop Until Bedingung End Sub
In diesem Beispiel findet die Prüfung erst nach dem Schleifendurchlauf statt.
i
wird nur ein einziges Mal um 1 erhöht, aber da die Bedingung
schon von Anfang an erfüllt ist, wird nach dem ersten Schleifendurchlauf auch schon
die Schleife beendet.
Man kann bei Do
-Schleifen auch ganz auf
eine Bedingung verzichten. Die Schleife wird dann endlos wiederholt. Dann sollte
es eine Abbruchanweisung innerhalb der Schleife geben.