Tipps & Tricks: Do-Schleifen

Die verschiedenen Versionen von Do...Loop-Anweisungen

Die verschiedenen Versionen von Do...Loop-Anweisungen sind alle so angelegt, dass sie einen Codeblock so lange ausführen, bis eine Bedingung erfüllt wird. Um zu entscheiden, ob die Schleife weiter ausgeführt werden soll, wertet die Do...Loop-Anweisung einen Bedingungsausdruck aus.
Es gibt unzählige Anwendungsmöglichkeiten für Do...Loop-Strukturen. Man kann zum Beispiel:

  • Eine Fehlermeldung immer wieder einblenden, bis der Mensch vor dem Bildschirm endlich einen gültigen Eintrag in ein Dialogfenster tippt.
  • Daten aus einer Datei lesen, bis das Ende der Datei erreicht ist.
  • Kurze Strings in langen Strings suchen und zählen.
  • Dem Programm für eine festgelegte Zeit Muße gönnen.
  • Aktionen an allen Elementen in einem Array vornehmen.
  • Mit If...Then-Anweisungen Aktionen mit mehreren Elementen eines Arrays durchführen, die bestimmte Kriterien erfüllen.
Typische Do...Loop-Anweisungen
Do...Loop-Anweisungen
Anweisung Ausführung K/F
Do While...Loop Beginnt und wiederholt den Block nur, wenn die Bedingung wahr ist. K
Do...Loop While Führt den Block einmal aus und wiederholt ihn, solange die Bedingung wahr ist. F
Do Until...Loop Beginnt und wiederholt den Block nur, wenn die Bedingung falsch ist. K
Do...Loop Until Führt den Block einmal aus und wiederholt ihn, solange die Bedingung falsch ist. F
Do...Loop Wiederholt den Block unbegrenzt lange und macht einen Abgang, wenn ein Bedingungsausdruck innerhalb einer Schleife eine End Do-Anweisung ausführt. -

HinweisHinweis: K = kopfgesteuert, F = fußgesteuert. Die While...Wend-Anweisung entspricht im Wesentlichen der Do While-Anweisung und wird daher nicht separat betrachtet.

Kopf oder Fuß – die Bedingung diktiert den Ablauf

Der Unterschied zwischen Do While...Loop und Do...Loop While-Anweisungen ist schnell erklärt: Die Do While...Loop-Anweisung hat ihrer Bedingung am Anfang der Schleife (kopfgesteuert), während sie bei Do...Loop While-Anweisungen am Ende steht (fußgesteuert).

Wann eine kopf- und wann eine fußgesteuerte Schleife angebracht ist, hängt von der Aufgabe ab. Wenn die Ausführung einer Schleife von einer Bedingung abhängig ist, sollte man diese auch zu Beginn der Schleife überprüfen.

Wenn die Ausführung der Schleife in jedem Fall erfolgen muss und man sicher ist, dass die Bedingung zum Beenden der Schleife noch nicht erreicht ist, kann man die Bedingung auch erst im „Schleifenfuß“ überprüfen.

Ein Beispiel ohne nennenswerten Nutzen:

Beispiel:

' ein sinniges Beispiel :o)
Sub Dreh_die_Zahlen_um()
 
    Dim sRückwärtsNummer    As String
    Dim lOriginalNummer     As Long
    Dim lEineZahl           As Long
 
   'Die erste Schleife
    Do While lOriginalNummer < 10
        lOriginalNummer = InputBox("Bitte gibt eine Zahl größer 9 ein!")
    Loop
   'Die zweite Schleife
    Do While lOriginalNummer
        lEineZahl = lOriginalNummer Mod 10
        sRückwärtsNummer = sRückwärtsNummer & Str(lEineZahl)
        lOriginalNummer = Int(lOriginalNummer / 10)
    Loop
 
    MsgBox sRückwärtsNummer
 
End Sub

Bitte das Beispiel einfach abtippen und ausprobieren...

Welches Ergebnis erhalten wir bei der Eingabe:

617923             ?
987654321123456789 ?
Wann man Do ohne While und Until verwendet

Mit Standard Do...While/Until...Loop-Anweisungen kann man Bedingungen am Anfang oder am Ende einer Schleife abfragen. Was aber, wenn man das irgendwo mitten in der Schleife tun möchte?

In diesem Fall benutzt man am besten eine Do...Loop-Anweisung ohne While oder Until. Diese Arbeitstechnik verlangt, dass eine If- oder Select Case-Anweisung in der Schleife verschachtelt wird. Dabei schließen ein- oder mehrere Zweige der verschachtelten Bedingungsanweisung eine Exit Do-Anweisung ein, die dem Programm erlaubt, die Schleife zu beenden, wenn eine festgelegte Bedingung erfüllt wird.

Do
  'bei jedem Durchlauf der Schleife
  'ausführende Anweisungen:
  If Bedingung then
    Exit Do
  End if
  'weitere auszuführende Anweisungen,
  'falls Schleife weiterläuft
Loop

Man sieht hier recht deutlich, dass sich dieses Vorgehen gut eignet, wenn man einige der Anweisungen der Schleife unabhängig von der Erfüllung der Bedingung ausführen möchte. Es ist darüber hinaus nützlich, wenn die Schleife unter mehreren verschiedenen Bedingungen enden soll.

Noch ein Beispiel ohne nennenswerten Nutzen:

Beispiel:

Sub Antwort_bekommen()
 
    Dim sAntwort As String
 
    sAntwort = InputBox("Gib Deine Antwort (A-E) ein.")
    Do
        If sAntwort = "" Then
            sAntwort = InputBox("Du hast nichts eingeben." & vbCrLf & _
                                "Bitte gib einen Buchstaben zwischen A und E ein.")
 
        ElseIf Len(sAntwort) > 1 Then
            sAntwort = InputBox("Die Antwort sollte nur 1 Buchstabe sein." & vbCrLf & _
                                "Versuche es noch einmal.")
 
        ElseIf UCase(sAntwort) < "A" Or UCase(sAntwort) > "E" Then
            sAntwort = InputBox("Du hast ein ungültiges Zeichen eingegeben." & vbCrLf & _
                                "Gib einen Buchstaben zwischen A und E ein.")
 
        Else
 
            Exit Do
        End If
    Loop
 
    MsgBox "Na geht doch ;o)"
 
End Sub