Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Grundlagen

Schleifen (1) - For - Next Zählschleife

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --Gruppenthema: 3 Folgen 1 2 3 Sie sind in Folge:1
Die zählende For - Schleife

Diese For - Next Standard - Schleife ist die simpelste von allen.
(Die For Each ... Schleife wird gesondert behandelt)
Sie zählt eine ganzahlige Variable hoch oder runter in bestimmten ganzahligen Schritten.

For Variable = Startwert to Endwert [Step]

Next [Variable]
Die Angaben in [] sind optional.

Beispiele:
Einfaches hochzählen:

For i = 1 To 10
MsgBox i
Next i

Dies ist die simpelste Form.
Die Schleife wird 10 mal durchlaufen (Startwert = 1, Endwert = 10 und Step ist wenn nicht angegeben 1)

Ich könnte auch auf das i bei Next verzichten, aber dies sollten Sie niemals tun!
Die Lesbarkeit des Codes würde vehement darunter leiden.

Hochzählen in Schritten:

For i = 1 To 10 Step 2
MsgBox i
Next i

Mit dem Step gebe ich die Schrittweite an.
Was meinen Sie, wieviel mal wird die Schleife durchlaufen und welchen Wert gibt die letzte Msg Box aus?

Durchlaufen wird sie 5 * und der letzte Wert ist 9 !
Beim ersten Durchlauf ist i = 1
Dann step 2 also i = 3 usw... bis i = 9.
Beim Next wird i auf 11 hochgezählt, dies erfüllt aber nicht mehr die Bedingung to 10!

Daran sieht man, wie die Schleife konzipiert ist.
Der Zählvariablen wird ein Wert zugewiesen und eine Abbruchbedingung (das To) geschaffen.
Bei jedem Next wird die Variable um den Stepwert erhöht und die Schleife kommt wieder zum For und überprüft dann ob die Bedingung noch erfüllt wird.

For i = 14 To 10
MsgBox i
Next i
Wie oft wird diese Schleife durchlaufen ?

Richtig, kein einziges Mal!
Die Bedingung ist gleich beim ersten Mal nicht erfüllt und somit wird die Schleife kein einziges Mal durchlaufen.

Dies ist ein ganz wichtiger Punkt!

Damit kann man wunderbar Schleifen bauen, die einfach nicht durchgeführt werden, wenn eine Bedingung nicht erfüllt wird.
Bsp:

For i = 4 To ActiveWorkbook.Sheets.Count
MsgBox ActiveWorkbook.Sheets(i).Name
Next i

Wenn nun die Arbeitsmappe nur drei Blätter hat, wird die Schleife nicht durchlaufen.
(Dies kann in vielen Situationen sehr nützlich sein, anstatt z.B. vorher zu überprüfen wieviele Blätter es gibt (in unserem Beispiel))

Rückwärts zählen

For i = 10 To 5 Step -1
MsgBox i
Next i

Hier wird der Startwert mit 10 vorgegeben und der Endwert mit 5.
Normalerweise würde die Schleife nicht durchlaufen.
Durch unser Step -1 sagen wir aber der For Schleife, dass sie eine Abnehmende ist.
Tatsächlich liegt hier ein großes Vergesslichkeitsproblem vor
Nämlich das man den Negativ Step anzugeben vergisst.

Wofür brauche ich solche Rückwärtsschleifen?

Sehr oft, wenn ich etwas zählbares löschen will.
Nehmen wir an, Sie wollen alle Blätter einer Arbeitsmappe löschen bis auf das Erste.
Und nehmen wir an, die Mappe hat 4 Blätter mit Namen A B C D


Jetzt könnte man in etwa denken (und nachfolgendes ist kein richtiger Code sondern nur beispielhaft) :

For i = 2 to AnzahlBlätterInMappe
LöscheBlatt(i)
Next i

In unserem gedachten Beispiel haben wir die Anzahl 4.
AnzahlBlätterInMappe wäre dann die 4 (und die ändert sich nicht, sondern wird nur einmal initialisiert!)

Beim ersten Durchlauf ist i = 2 und LöscheBlatt(2) sollte gehen, Blatt B wird gelöscht.
Dann wird i zu 3 in der Mappe sind noch 3 Blätter, und das dritte Blatt wird gelöscht.
Wobei das 3.Blatt nun aber D ist, denn durch das Löschen des 2.Blattes haben sich ja C und D eines nach vorne verschoben.

Und beim nächsten Durchlauf rasseln wir in einen Fehler, weil unsere Mappe nur noch 2 Blätter hat aber ich das 4.Blatt löschen will

Unser Code müsste also in etwa so aussehen:
For i = AnzahlBlätterInMappe to 2 Step -1
LöscheBlatt(i)
Next i

Und nun im richtigen Leben (mal angenommen kein Blattschutz oder so und Achtung es wird gnadenlos gelöscht)

Sub BlaetterWeg()
Dim i As Integer
On Error GoTo Fehler ' Dafür sorgen, das wir die Sicherheitsabfragen wieder einschalten
Application.DisplayAlerts = False ' Abfrage zum Löschen des Blattes unterdrücken
For i = ActiveWorkbook.Sheets.Count To 2 Step -1
ActiveWorkbook.Sheets(i).Delete
Next i

Fehler:
Application.DisplayAlerts = True ' Auf jeden Fall wieder einschalten
End Sub
Peter Haserodt
  • Formelhilfe
  • Makroentwicklung
  • VBA-Programmierung
  • + + + + + + + + +
Verschachtelte Schleifen

Natürlich kann man For Schleifen auch verschachteln, dies wird oft genutzt, z.B. Felder zu durchlaufen.

Eine ansich völlig sinnlose Schleife soll dies demonstrieren:
(Sie benutzt das aktive Blatt und dies ist hoffentlich ein Tabellenblatt )

For i = 1 To 2
For k = 1 To 3
MsgBox ("Zeile: " & i & " Spalte: " & k & " Inhalt ist: " & Cells(i, k))
Next k
Next i


Wie die Schleife arbeitet, können Sie gut sehen, wenn Sie auf dem Tabellenblatt z.B. folgendes eingeben:
Tabelle1
ABC
1HammerZangeMeißel
2HundKatzeMaus

Und meine Verschachtelungstiefe bleibt weitgehend mir überlassen

Aus einer Schleife ausbrechen

Auch dies ist möglich und durchaus mal notwendig.
Die Struktur hierfür:

For i = Anfang To Ende
	If IrgendwasVon(i) = MeinePrüfung Then
		
		Aktion Durchführen
		Exit For
		
	End If
Next i

So, das war die einfach For-Schleife.
Die Beispiele sollten genügen, um jetzt selbst zu testen.



Dieses Thema hat weitere Beiträge

Schleifen (1) - For - Next Zählschleife
Schleifen (2) - Do Schleifen
Schleifen (3) - For Each Schleife

Weitere Artikel der Gruppe: Grundlagen Aus Excel VBA
Nach oben
ToDo
Google Werbung