18.2. Mehrfaches Ausführen desselben Codes - Schleifenstrukturen

Mit Schleifenstrukturen können Sie eine Anweisung oder eine Folge von Anweisungen mehrmals ausführen. Die wichtigsten Schleifenstrukturen von Visual Basic sind:

- For..Next
- While..Wend
- Do..Loop


Mehrere Operationen auf einem Objekt lassen sich auch mit der With-Anweisung ausführen (siehe Online-Hilfe)



18.2.1 For...Next

Steht die Anzahl der Schleifendurchläufe fest, so bieten sich For - Schleifen an. Im Gegensatz zur Durchlaufe-Schleife verwendet die For-Schleife einen Zähler, d.h. eine Variable, deren Wert bei jedem Schleifendurchlauf größer oder kleiner wird. In der folgenden Sub-Prozedur können Sie beispielsweise festlegen, wie oft ein Signalton ausgegeben werden soll.

Sub MehrereSignale()
  AnzahlSignale =
InputBox("Wie viele Signale?")
  For Zähler = 1 To AnzahlSignale
 
  Beep
  Next
Zähler
End Sub

Das vorhergehende Beispiel enthält nur eine einfache Schleife. Sie können Schleifen erweitern, indem Sie für den Zähler eine bestimmte Schrittweite festlegen. Die folgende Sub-Prozedur addiert alle ungeraden im angegebenen Bereich.

Sub Addieren()
  For i = 1 To 10 Step 2
    Summe = summe + i
  Next i
  Range("A5").Value = summe
End Sub

Die verkürzte Darstellung der Syntax von For...Next lautet wie folgt:

For Zähler = Anfang To Ende [Step Schritt]
  Anweisungen
Next Zähler

Bei den Argumenten Zähler, Anfang, Ende und Schritt handelt es sich um numerische Werte. Die eckigen Klammem weisen auf optionale Elemente hin und werden nicht tatsächlich in den Code eingegeben. Das Argument Schritt kann positiv oder negativ sein. Bei positivem Schritt darf Anfang nicht größer sein als Ende, weil sonst die Anweisungen in der Schleife nicht ausgeführt werden. Bei negativem Schritt, muss Anfang mindestens so groß sein wie Ende, damit der Schleifenrumpf ausgeführt wird. Wenn Schrittweite nicht angegeben wird, erhält Schritt die Voreinstellung 1.



Beim Ausführen einer For...Next-Schleife führt Visual Basic folgendes durch:

1. Der Zähler wird auf den Wert von Anfang gesetzt.

2. Es wird geprüft, ob Zähler größer ist als Ende. Ist dies der Fall, beendet Visual Basic die Schleife. (Bei negativem Schritt muss Zähler kleiner sein als   Ende, damit die
Schleife beendet wird.)

3. Die Anweisungen werden ausgeführt.

4. Der Zähler wird um 1 bzw. den für Schritt angegebenen Wert inkrementiert.

5. Die Schritte 2 bis 4 werden wiederholt.



18.2.2 For Each...Next

Eine For Each ...Next-Schleife ist einer For...Next-Schleife ähnlich, wiederholt aber eine Folge von Anweisungen für alle Elemente eines Datenfeldes (siehe u.a. in der Hilfe unter ARRAY) oder einer Auflistung von Objekten, anstatt eine genau bestimmte Anzahl von Schleifendurchläufen durchzuführen. Diese Variante bietet sich z.B. dann an, wenn die Anzahl der Elemente in einer Auflistung nicht bekannt ist.
Durch die folgende Sub-Prozedur werden beispielsweise alle geöffneten Arbeitsmappen geschlossen.

Sub AlleArbeitsmappenSchließen()
 
'Die Variable Mappe bezieht sich auf die Elemente von Workbooks (Auflistung der Arbeitsmappen)
  For Each Mappe In Workbooks()
    Mappe.
Close
  Next Mappe
End Sub

Die folgende Prozedur vergrößert den Wert aller Zellen im markierten Bereich, sofern sie einen Wert enthalten. Denken Sie daran, dass ein Zellbereich ein Objekt darstellt. Sie müssen die Set-Anweisung (siehe Hilfe) verwenden, wenn Sie eine Variable mit einem Bezug auf ein Objekt erstellen wollen.

Sub AktuelleAuswahlHochzählen()
Set Zielbereich = Selection
  'In der Schleife bezieht sich C jeweils auf eine bestimmte Zelle.
  For Each C In Zielbereich
    If IsNumeric(C.Value) Then
      C.Value = C.Value + 1
    End If
  Next
C
End Sub

Verkürzte Darstellung der Syntax:

For Each Element In Gruppe
  Anweisungen
Next Element



Beim Ausführen einer For Each...Next-Schleife führt Visual Basic folgendes durch:
1. Element wird als Bezeichner für das erste Element in der Gruppe festgelegt (wenn mind. ein Element enthalten ist).
2. Die Anweisungen werden ausgeführt.
3. Prüft, ob es sich bei Element um das letzte Element in der Gruppe handelt. Ist dies der Fall, verlässt VB die Schleife.
4. Element wird als Bezeichner für das nächste Element in der Gruppe festgelegt.
5. Die Schritte 2 bis 4 werden wiederholt.

Beim Einsatz von Für Alle...Nächste gelten die folgenden Einschränkungen:
Bei Auflistungen muss Element eine Variable vom Typ Variant, eine allgemeine Variable vom Typ Objekt oder eine bestimmte Objektvariable im Rahmen der OLE-Automatisierung sein. Bei Datenfeldern sind für Element nur Variablen vom Typ Variant zulässig.



18.2.3 While- und Do-Schleifen

Wenn die Anzahl der Schleifendurchläufe nicht von Anfang an feststeht oder nicht vorhergesagt werden kann, verwendet man Durchlaufe-Schleifen d.h. ein Anweisungsblock wird ausgeführt ohne die Anzahl der Ausführungen explizit festzulegen.
Es gibt verschiedene Varianten der Durchlaufe...Schleife-Anweisung, aber alle werten eine numerische Bedingung aus, um festzustellen, ob ein weiterer Schleifendurchlauf durchgeführt werden soll.



18.2.3.1. While-Schleifen

Die Anweisungen zwischen While und Wend werden wiederholt, solange "Aussage" True ist, also eine beliebige Aussage, die wie a>1 einfach oder wie (a=1 and b=10) or x$ = "Hallo" sehr komplex sein kann.

Sub Zähler()
Dim x As Integer
  x = 1
  While x < 11
    Debug.Print x
    x = x + 1
  Wend
End Sub
Verkürzte Darstellung der Syntax:

While Aussage
Anweisungen
Wend



18.2.3.2.Do-Schleifen

Do-Schleifen stellen eine Art Verallgemeinerung der While-Schleife dar und machen diese überflüssig. Im Gegensatz zu While kann man wählen, ob am Anfang oder am Ende der Schleife getestet wird.

Test am Schleifenanfang Test am Schleifenende

Do (While | Until) Aussage
  Anweisungen
Loop

Do
  Anweisungen
Loop (While | Until) Aussage
  • die Anzahl der Schleifendurchläufe steht anfangs nicht fest
  • die Anweisungen in der Schleife werden überhaupt nicht ausgeführt, wenn die Bedingung zu Beginn den Wert Falsch hat
  • die Anweisungen müssen die Bedingung letztendlich auf Falsch setzen, da sonst die Schleife niemals beendet wird (Endlosschleife)
  • eine Endlosschleife lässt sich durch Drücken von ESC unterbrechen.
  • einmaliges Ausführen der Schleife vor dem ersten Überprüfen einer Bedingung
  • Schleife führt die Anweisungen in der Schleife aus und überprüft die Bedingung im Anschluss an die Ausführung
  • jede Anweisung wird demnach mindestens einmal ausgeführt
  • auch hier können Endlosschleifen entstehen



Beispiele:

Dim x as Integer
  x=1
  Do While x<11
    Debug.print x
    x=x+1
  Loop
Schleife wird zehnmal ausgeführt
Dim x as Integer
  x=1
  Do Until x<11
    Debug.print x
    x=x+1
  Loop
Schleife wird gar nicht ausgeführt, weil x schon kleiner als 11 ist
Dim Summe as Integer, Betrag as Integer
  Summe=0
  Betrag=1
  Do While Summe<400
    Summe=Summe+Betrag
    Betrag=Betrag+1
  Loop
  Debug.print "Die Summe ist:",Summe
Eine Zahlenfolge wird solange addiert, wie die Summe kleiner als 400 ist
Dim Summe as Integer, Betrag as Integer
  Summe=0
  Betrag=1
  Do Until Summe >= 400
    Summe=Summe+Betrag
    Betrag=Betrag+1
  Loop
  Debug.print "Die Summe ist:",Summe
Eine Zahlenfolge wird solange addiert, bis die Summe größer oder gleich 400 ist

Function Zeichenfolgenanzahl(LangeZnF, SuchZnF)
Position = 1
Do While InStr(Position, LangeZnF,    SuchZnF)
'gibt Wahr/Falsch aus
Position = InStr(Position, LangeZnF, SuchZnF) + 1
Count = Count + 1
Loop
Zeichenfolgenanzahl = Count
End Function

Diese Funktion zählt die Häufigkeit des Auftretens einer gesuchten Zeichenfolge (Suchzeichenfolge) innerhalb einer anderen Zeichenfolge und durchläuft dazu eine Schleife, solange die gesuchte Zeichenfolge gefunden wird.



18.2.4 Benutzen der MsgBox zur Schleifensteuerung

Sub Box1()
  Do
    summen = summen + 1
    Antwort =
MsgBox("Weitere Daten verarbeiten?", vbYesNo)
  Loop While Antwort = vbYes
  Debug.Print summen
End Sub


Sub Box2()
  antwort =
MsgBox("Weitere Daten verarbeiten?", vbYesNo)
  Do Until antwort = vbNo
    summen = summen + 1
    antwort =
MsgBox("Weitere Daten verarbeiten?", vbYesNo)
  Loop
  Debug.Print summen
End Sub


Sub box3()
  Antwort =
MsgBox("Weitere Daten verarbeiten?", vbYesNo)
  Do
    summen = summen + 1
    Antwort = MsgBox("Weitere Daten verarbeiten?", vbYesNo)
  Loop Until Antwort = vbNo
  Debug.Print summen
End Sub


5 3 4