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 |
|
|
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 |