Wie Du in VBA Schleifen die Arbeit machen lassen kannst (Teil IV)

In Teil III war die Do-Loop-Schleife das Thema. Wie versprochen geht es heute mit D-While- und Do-Until-Schleifen weiter. Beide Schleifenarten ähneln in gewissen Sinne der Do-Loop-Schleife, denn zu Beginn des Makros steht auch hier nicht fest, wieviel Durchläufe erforderlich sind.

Um keine Endlosschleifen zu erzeugen, müssen auch bei diesen Schleifen Bedingungen gesetzt werden. Die Befehlswörter dafür sind hier While bzw. Until. Beide Wörter können sowohl hinter Do als auch hinter Loop die Bedingungen einleiten.

Die Do-While-Schleife

Gleich ein Beispiel (While steht am Anfang, hinter Do):

In einer Do-While-Schleife soll eine Namensliste abwärts geprüft werden bis der Name „Harry“ erreicht ist.

DoWhile1

Du gehst wieder in den VBA-Editor (mit Alt+F11) und suchst ein Modul auf. Nun schreibst Du z.B. dieses kleine Makro:

Sub DoWhile1()
Dim intRow As Integer
intRow=270
Do While Cells(intRow,7).Value<>“Harry“
intRow=intRow+1
Loop
MsgBox („Suchbegriff wurde in Zelle “ & Cells(intRow,7).Address & “ gefunden!“)
End Sub

Die MsgBox wirft richtig die Meldung „Suchbegriff wurde in Zelle $G$375 gefunden!“ aus.

Im nächsten Beispiel (While steht am Ende, hinter Loop) soll die Schleife ausgeführt werden, solange in der Namensliste nicht der Name Lars erreicht ist. Eine MsgBox teilt mit, dass bis Zelle … der Name Lars nicht gefunden wurde.

Dies ist die Liste

DoWhile2

und so sieht das Makro aus:

Sub DoWhile2()
Dim intRow As Integer
intRow=287
Do
intRow=intRow+1
Loop While Cells(intRow,7).Value <>“Lars“
MsgBox („Bis Zelle “ & Cells(intRow-1,7).Address & “ wurde der Name Lars nicht gefunden!“)
End Sub

Die Mitteilung der MsgBox lautet: „Bis Zelle $G$293 wurde der Name Lars nicht gefunden!“

Die Do-Until-Schleife

Ich beginne auch hier mit einem Beispiel, in dem die Anweisung, hier Until, am Anfang (hinter Do) steht. Die Werte einer Zahlenreihe sollen quadriert werden, bis das Ergebnis größer als1750 ist.

Die Zahlenreihe sieht beispielhaft so aus, wobei die Ergebnisse der Quadrierung nicht angezeigt werden sollen:

DoUntil1

Mit diesem Makro setze ich die gestellten Bedingungen um:

Sub DoUntil1()
Dim intRow As Integer
Dim intErg As Integer
intRow = 307
Do Until intErg >= 1750
intErg = Cells(intRow, 7).Value * Cells(intRow, 7).Value
intRow = intRow + 1
Loop
MsgBox („Der Grenzwert 1750 wird erstmalig in Zelle “ & Cells(intRow – 1, 7).Address & „überschritten!“)
End Sub

In der Cell-Anweisung habe ich von intRow noch 1 abgezogen, warum, fragst Du Dich vielleicht?

Nachdem 1750 überschritten wird (1764) wird nochmals intRow=intRow+1 gerechnet. Die Variable intRow hat jetzt schon den Wert 326 für Zeile 326. In der Zeile 325 wird aber bereits der Wert von 1750 überschritten (1764). Deshalb gehe ich von Zeile 326 einen Schritt zurück.

Die Meldung der MsgBox lautet „Der Grenzwert 1750 wird erstmalig in Zelle $G$325 überschritten!“.

Jetzt will ich das Until ans Ende (hinter Loop setzen. Dazu nehme ich die gleiche Zahlenreihe, setze den Grenzwert aber auf 1500. Dieser Wert soll nicht überschritten werden.

Mit diesem Makro setze ich das um:

Sub DoUntil2()
Dim intRow As Integer
Dim intErg As Integer
intRow = 307
Do
intErg = Cells(intRow, 7).Value * Cells(intRow, 7).Value
intRow = intRow + 1
Loop Until intErg>=1500
MsgBox („Der Grenzwert 1500 wird erstmalig in Zelle “ & Cells(intRow – 1, 7).Address & „überschritten!“)
End Sub

Die Meldung lautet: „Der Grenzwert 1500 wird erstmalig in Zelle $G$322 überschritten!“.

Abschließend will ich den Grenzwert variabel gestalten. Dazu deklariere ich eine dritte Variable, auch wieder mit dem Datentyp Integer und setze sie ins Makro ein. Den Grenzwert trage ich mir im Beispiel in Zelle G348 ein.

Sub DoUntil3()
Dim intRow As Integer
Dim intErg As Integer
Dim intGrenz As Integer
intRow = 307
intGrenz=Range(„G348“).Value
Do
intErg = Cells(intRow, 7).Value * Cells(intRow, 7).Value
intRow = intRow + 1
Loop Until intErg>= intGrenz
MsgBox („Der Grenzwert „& intGrenz & „wird erstmalig in Zelle “ & Cells(intRow – 1, 7).Address & „überschritten!“)
End Sub

Die Meldung lautet: „Der Grenzwert 1400 wird erstmalig in Zelle $G$321 überschritten!“. Auch das ist richtig.

Du siehst, dass der Grenzwert in der Boxmeldung als Variable eingetragen ist. Das geschieht mit:

&, Leerzeichen, Variable, Leerzeichen, &

Änderst Du die Vorgabe in G248, wird auch das Makro entsprechend reagieren und in der Boxmeldung den jeweils aktuellen Wert ausgeben.

Im letzten Teil, in 14 Tagen geht es noch um While-Wend- und For-Each-Schleifen, bis dahin.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s