In den beiden vorangegangenen Artikeln in dieser Serie hast Du die For-Next-Schleife kennengelernt.
Du hast Werte hoch und runter zählen und per MsgBox ausgeben lassen. Schließlich hast Du die For-Next-Schleifen so programmiert, dass die Wochentage senkrecht bzw. waagerecht in Zellen eingetragen wurden.
Heute geht es um die Do-Loop-Schleife.
Do-Loop, Do-While und Do-Until sind Prüfschleifen. Bei Prüfschleifen wird die Prozedur solange durchlaufen, wie eine Bedingung wahr oder falsch ist.
Was ist nun eine Do-Loop-Schleife?
Eine Do-Loop-Schleife enthält keine Zählvariablen. Die Anweisung wird solange ausgeführt bis eine Bedingung erfüllt ist. Aber aufgepasst: Ist keine Bedingung vorgegeben, kann sich eine solche Schleife zur Endlosschleife entwickeln. D.h. das Makro kommt nicht zum Ende und läuft endlos.
Das könnte z.B. passieren, wenn Du einer Variablen den Wert 1 zuweist und in der Do-Loop-Schleife verlangst, dass die Variable – 1 und dann wieder + 1 gerechnet wird.
Nun warst Du aber vielleicht doch neugierig und hast wider aller guten Worte das Makro gestartet? Außer, dass Du die Eieruhr als Zeichen für Arbeit siehst, passiert gar nichts, jedenfalls nicht sichtbar. Aber das Makro läuft und läuft.
Es wird ununterbrochen gerechnet: 1 – 1 + 1 – 1 + 1 – 1 + 1 usw. Im Makro ist keine Anweisung enthalten, die das beendet. Wie kannst Du die Endlosschleife nun stoppen?
Drücke die ESC-Taste ein paar Sekunden und klicke dann auf Beenden.
Das Do startet übrigens die Anweisung. Bei Loop wird wieder auf Do zurück gegangen und die Schleife erneut durchlaufen, bis, ja bis eine Bedingung erfüllt ist.
Deshalb willst Du nun einen nächsten Schritt machen und eine Bedingung in die Schleife einbauen. Z.B. soll von 1 an aufwärts gezählt werden. Das Makro soll stoppen, wenn die Zahl 3387 erreicht ist. Das Makro könnte so aussehen:
Sub DoLoop2()
Dim intZahl As Integer
intZahl=1
Do
intZahl=intZahl+1
If intZahl=3387 Then
MsgBox („Die Zahl 3387 ist erreicht!“)
Exit Do
End If
Loop
End Sub
Neu für Dich ist die eingebaute If-Anweisung. Eine If-Anweisung ist nichts anderes als eine WENN-Anweisung in Excel.
„Übersetzt“ bedeutet die Anweisung:
Wenn intZahl=3387, dann lasse eine MsgBox mitteilen, dass die Zahl 3387 erreicht ist. Dann beende die Prozedur mit „Exit Do“.
Eine If-Anweisung muss in VBA immer mit „End If“ beendet werden.
Ein weiteres Beispiel:
Sub DoLoop3()
Dim intZeile As Integer
Dim intZähler As Integer
Dim intMult As Integer
intZeile=Range(„A2“).Row
intZähler=2
intMult=2
Do
intMult=intMult+1
intZeile=intZeile+(intMult*intZähler)
If intMult=10 Then
MsgBox intZeile
Range(„B213“)=Range(„A“&intZeile).Value
Exit Do
End If
Loop
End Sub
In B213 steht nach Ausführung des Makros nun der Inhalt aus Zelle A106: „Die Wochentage sollen in Spalte H, also Spalte 8, ab Zeile 96 aufgelistet werden.“
In diesem Beispiel sind drei Variablen deklariert. Dim intZeile dient der Bestimmung des Ausgangspunktes, ihr wird später der Wert 2 zugewiesen. Zeile 2 ist also die Startzeile.
Dim intZähler bestimmt, in welchen Schritten vorwärts gegangen werden soll, hier auch 2.
Schließlich bestimmt Dim intMult den Multiplikator für intZähler, hier auch 2.
Klingt kompliziert, da gebe ich Dir recht. Was also passiert genau?
1. Schritt: intMult wird von 2 auf 3 erhöht, intZeile errechnert sich neu: 2+(3*2)=8
2. Schritt: intMult wird von 3 auf 4 erhöht, intZeile errechnet sich neu: 8+(4*2)=16
usw.
Die nachfolgende Abbildung zeigt alle Programmschritte, bis letztlich Zeile 106 erreicht ist, dann, wenn intMult den Wert 10 erreicht hat.
Die Formeln in dieser Tabelle lauten:
O5 =O4+1
P5 =P4+(O5*N5)
Das Makro gibt zum Schluss in Zelle B213 den in A106 enthaltenen Text aus.
Damit sollen genug Anregungen zum Thema Do-Loop-Schleifen gegeben sein.
Merke: Wenn keine Bedingungen im Makro gesetzt sind, kann schnell eine Endlosschleife entstanden sein. Damit das nicht passiert, hast Du in die Do-Anweisungen jeweils eine If-Anweisung eingebaut.
Probier einfach mal eigene Ideen aus, Du weißt ja, eine Endlosschleife kannst Du zur Not mit der ESC-Taste beenden.
Entdecke mehr von Clevercalcul
Melde dich für ein Abonnement an, um die neuesten Beiträge per E-Mail zu erhalten.