Schleifen

Oft ist es sinnvoll, einen Programmabschnitt mehrfach ausführen zu lassen. Das nennt man eine „Schleife“.

For .. Next

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.

Do .. Loop

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.