VBA in Excel/ Beispiele für Schleifen
Siehe auch: VBA in Excel/_Schleifen
Allgemeines / EinleitungBearbeiten
Schleifen sind zentraler Bestandteil jeder Programmiersprache. Anhand von Schleifen ist es möglich, Programmanweisungen
mehrmals hintereinander zu wiederholen.
- Beispiel einer Programmierung ohne Schleifeneinsatz:
Cells(1, 1).Value = "ZEILE 1"
Cells(2, 1).Value = "ZEILE 2"
Cells(3, 1).Value = "ZEILE 3"
Cells(4, 1).Value = "ZEILE 4"
Cells(5, 1).Value = "ZEILE 5"
Cells(6, 1).Value = "ZEILE 6"
- Beispiel der gleichen Programmierung mit Schleifeneinsatz:
For iCounter = 1 To 6
Cells(iCounter, 1).Value = "Zeile " & iCounter
Next iCounter
Unter anderem kann der Codeumfang somit erheblich reduziert werden, wie im vorhergehenden Beispiel zu sehen ist. Weitere Vorteile werden anhand der unterschiedlichen Schleifenarten ersichtlich (z.B. variable Anzahl an Durchläufen). Grundsätzlich gibt es zwei Arten von Schleifen, die Zählschleifen (die Anzahl der Schleifendurchläufe wird durch eine Variable oder konstante Zahl bestimmt) und Prüfschleifen (die Schleife wird durchlaufen solange eine Bedingung wahr bzw. falsch ist).
Grundlagenwissen zu Schleifen lässt sich hier nachlesen: Wikipedia: Schleifen (Programmierung)
Schleifentypen-BeispieleBearbeiten
Jeder Schleifentyp kann weitere Bedingungsprüfungen enthalten. Bei Zählschleifen kann die Schrittgröße festgelegt werden; der Default-Wert ist 1.
ZählschleifenBearbeiten
For-To-Next-SchleifeBearbeiten
- Prozedur: ForNextCounter
- Art: Sub
- Modul: Standardmodul
- Zweck: Zähler hochzählen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn
- Wert berechnen und addieren
- Schleifenende
- Ergebnisausgabe
- Code:
Sub ForNextCounter()
Dim dValue As Double
Dim iCounter As Integer
For iCounter = 1 To 100
dValue = dValue + iCounter * 1.2
Next iCounter
MsgBox "Ergebnis: " & dValue
End Sub
For...To...Next-Schleife mit Schrittgrößenangabe nach vornBearbeiten
- Prozedur: ForNextStepForward
- Art: Sub
- Modul: Standardmodul
- Zweck: Zähler schrittweise hochzählen
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn
- Wert ausgeben
- Schleifenende
- Code:
Sub ForNextStepForward()
Dim iCounter As Integer
For iCounter = 1 To 10 Step 2
MsgBox iCounter
Next iCounter
End Sub
For...To...Next-Schleife mit Schrittgrößenangabe zurückBearbeiten
- Prozedur: ForNextStepBack
- Art: Sub
- Modul: Standardmodul
- Zweck: Zähler schrittweise hochzählen
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn
- Wert ausgeben
- Schleifenende
- Code:
Sub ForNextStepBack()
Dim iCounter As Integer
For iCounter = 10 To 1 Step -3
MsgBox iCounter
Next iCounter
End Sub
Schleifen mit vorangestellter BedingungsprüfungBearbeiten
While ... Wend-SchleifeBearbeiten
- Prozedur: WhileWend
- Art: Sub
- Modul: Standardmodul
- Zweck: Zellen durchlaufen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Startwert setzen
- Schleifenbeginn
- Wert berechnen und addieren
- Zeilenzähler hochzählen
- Schleifenende
- Wert ausgeben
- Code:
Sub WhileWend()
Dim iRow As Integer
Dim dValue As Double
iRow = 1
While Not IsEmpty(Cells(iRow, 1))
dValue = dValue + Cells(iRow, 1).Value * 1.2
iRow = iRow + 1
Wend
MsgBox "Ergebnis: " & dValue
End Sub
Do ... Loop-SchleifeBearbeiten
- Prozedur: DoLoop
- Art: Sub
- Modul: Standardmodul
- Zweck: Zellen durchlaufen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Startwert setzen
- Schleifenbeginn
- Wert berechnen und addieren
- Bedingung prüfen
- Zeilenzähler hochzählen
- Schleifenende
- Wert ausgeben
- Code:
Sub DoLoop()
Dim iRow As Integer
Dim dValue As Double
iRow = 1
Do
dValue = dValue + Cells(iRow, 1).Value * 1.2
If IsEmpty(Cells(iRow + 1, 1)) Then Exit Do
iRow = iRow + 1
Loop
MsgBox "Ergebnis: " & dValue
End Sub
Do ... While-SchleifeBearbeiten
- Prozedur: DoWhile
- Art: Sub
- Modul: Standardmodul
- Zweck: Zellen durchlaufen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Startwert setzen
- Schleifenbeginn mit Bedingung
- Wert berechnen und addieren
- Zeilenzähler hochzählen
- Schleifenende
- Wert ausgeben
- Code:
Sub DoWhile()
Dim iRow As Integer
Dim dValue As Double
iRow = 1
Do While Not IsEmpty(Cells(iRow, 1))
dValue = dValue + Cells(iRow, 1).Value * 1.2
iRow = iRow + 1
Loop
MsgBox "Ergebnis: " & dValue
End Sub
Do-Until-SchleifeBearbeiten
- Prozedur: DoUntil
- Art: Sub
- Modul: Standardmodul
- Zweck: Zellen durchlaufen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Startwert setzen
- Schleifenbeginn mit Bedingung
- Wert berechnen und addieren
- Zeilenzähler hochzählen
- Schleifenende
- Wert ausgeben
- Code:
Sub DoUntil()
Dim iRow As Integer
Dim dValue As Double
iRow = 1
Do Until IsEmpty(Cells(iRow, 1))
dValue = dValue + Cells(iRow, 1).Value * 1.2
iRow = iRow + 1
Loop
MsgBox "Ergebnis: " & dValue
End Sub
Schleifen mit nachgestellter BedingungsprüfungBearbeiten
Do-Until-SchleifeBearbeiten
- Prozedur: DoUntil
- Art: Sub
- Modul: Standardmodul
- Zweck: Zellen durchlaufen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Startwert setzen
- Schleifenbeginn
- Wert berechnen und addieren
- Zeilenzähler hochzählen
- Schleifenende mit Bedingung
- Wert ausgeben
- Code:
Sub DoLoopWhile()
Dim iRow As Integer
Dim dValue As Double
iRow = 1
Do
dValue = dValue + Cells(iRow, 1).Value * 1.2
iRow = iRow + 1
Loop While Not IsEmpty(Cells(iRow - 1, 1))
MsgBox "Ergebnis: " & dValue
End Sub
Weitere Schleifen mit nachgestellter BedingungsprüfungBearbeiten
Do-Loop-Until-SchleifeBearbeiten
- Prozedur: DoLoopUntil
- Art: Sub
- Modul: Standardmodul
- Zweck: Zellen durchlaufen und Einzelwerte berechnen
- Ablaufbeschreibung:
- Variablendeklaration
- Startwert setzen
- Schleifenbeginn
- Wert berechnen und addieren
- Zeilenzähler hochzählen
- Schleifenende mit Bedingung
- Wert ausgeben
- Code:
Sub DoLoopUntil()
Dim iRow As Integer
Dim dValue As Double
iRow = 1
Do
dValue = dValue + Cells(iRow, 1).Value * 1.2
iRow = iRow + 1
Loop Until IsEmpty(Cells(iRow, 1))
MsgBox "Ergebnis: " & dValue
End Sub
Objektbezogene BeispieleBearbeiten
Einsatz bei Arbeitsmappen- und TabellenobjekteBearbeiten
Ausgabe der Arbeitsblattnamen der aktiven ArbeitsmappeBearbeiten
- Prozedur: EachWks
- Art: Sub
- Modul: Standardmodul
- Zweck: Arbeitsblattnamen der aktiven Arbeitsmappe ausgeben
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn
- Ausgabe der Namen
- Schleifenende
- Code:
Sub EachWks()
Dim wks As Worksheet
For Each wks In Worksheets
MsgBox wks.Name
Next wks
End Sub
Ausgabe der Arbeitsblattnamen alle geöffneten ArbeitsmappenBearbeiten
- Prozedur: EachWkbWks
- Art: Sub
- Modul: Standardmodul
- Zweck: Arbeitsblattnamen aller geöffneten Arbeitsmappe ausgeben
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn Arbeitsmappen
- Schleifenbeginn Arbeitsblätter
- Ausgabe der Namen
- Schleifenende Arbeitblätter
- Schleifenende Arbeitsmappen
- Code:
Sub EachWkbWks()
Dim wkb As Workbook
Dim wks As Worksheet
For Each wkb In Workbooks
For Each wks In wkb.Worksheets
MsgBox wkb.Name & vbLf & " -" & wks.Name
Next wks
Next wkb
End Sub
Ausgabe der integrierten Dokumenteneigenschaften der aktiven ArbeitsmappeBearbeiten
- Prozedur: EachWkbWks
- Art: Sub
- Modul: Standardmodul
- Zweck: Integrierte Dokumenteneigenschaften der aktiven Arbeitsmappe ausgeben
- Ablaufbeschreibung:
- Variablendeklaration
- Fehlerroutine
- Schleifenbeginn
- Ausgabe der Namen
- Schleifenende
- Ende der Fehlerroutine
- Code:
Sub EachDPWkb()
Dim oDP As DocumentProperty
On Error Resume Next
For Each oDP In ThisWorkbook.BuiltinDocumentProperties
MsgBox oDP.Name & ": " & oDP.Value
Next oDP
On Error GoTo 0
End Sub
Ausgabe der Formatvorlagen der aktiven ArbeitsmappeBearbeiten
- Prozedur: EachWkbWks
- Art: Sub
- Modul: Standardmodul
- Zweck: Formatvorlagen der aktiven Arbeitsmappe ausgeben
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn
- Wert ausgeben
- Schleifenende
- Code:
Sub EachStylesWkb()
Dim oStyle As Style
For Each oStyle In ThisWorkbook.Styles
MsgBox oStyle.Name
Next oStyle
End Sub
Ausgabe der einzelnen Zelladressen eines vorgegebenen BereichesBearbeiten
- Prozedur: EachWkbWks
- Art: Sub
- Modul: Standardmodul
- Zweck: Zelladressen eines vorgegebenen Bereiches ausgeben
- Ablaufbeschreibung:
- Variablendeklaration
- Schleifenbeginn
- Wert ausgeben
- Schleifenende
- Code:
Sub EachCellWks()
Dim rng As Range
For Each rng In Range("A1:B2")
MsgBox rng.Address(rowabsolute:=False, columnabsolute:=False)
Next rng
End Sub
Einsatz bei tabellenintegrierten Steuerelement-ObjektenBearbeiten
Prüfung, welches Optionsfeld in einer vorgegebenen Gruppe von Optionsfeldgruppen aktiviert istBearbeiten
- Prozedur: EachWks
- Art: Sub
- Modul: Klassenmodul der Tabelle
- Zweck: Ausgabe des Namens des aktivierten Optionsfelds einer vorgegenen Optionsfeldgruppe
- Ablaufbeschreibung:
- Variablendeklaration
- Schleife über alle Steuerelemente der Tabelle
- Prüfung des Typnamens des Steuerelements
- Wenn es sich um ein Optionsfeld handelt...
- Übergabe an eine Objektvariable
- Wenn das Optionsfeld aktiviert ist und es sich um ein Steuerelement von der Gruppe GroupB handelt...
- Ausgabe des Namens des Steuerelements
- Schleifenende
- Code:
Sub IfSelected()
Dim oOle As OLEObject
Dim oOpt As msforms.OptionButton
For Each oOle In OLEObjects
If TypeName(oOle.Object) = "OptionButton" Then
Set oOpt = oOle.Object
If oOpt And oOpt.GroupName = "GroupB" Then
MsgBox "In GroupB ist " & oOpt.Caption & " aktiviert"
End If
End If
Next oOle
End Sub
Einsatz bei Userform-Steuerelement-ObjektenBearbeiten
Prüfung, welche CheckBox-Elemente einer UserForm aktiviert sindBearbeiten
- Prozedur: cmdRead_Click
- Art: Sub
- Modul: Klassenmodul der UserForm
- Zweck: Ausgabe des Namen aktivierter CheckBox-Elemente einer UserForm
- Ablaufbeschreibung:
- Variablendeklaration
- Schleife über alle Steuerelemente der UserForm
- Wenn es sich um eine CheckBox handelt...
- Wenn die CheckBox aktiviert ist...
- Einlesen des CheckBox-Namens in eine String-Variable
- Schleifenende
- Wenn keine aktivierte CheckBoxes gefunden wurden...
- Negativmeldung
- Sonst...
- Ausgabe des oder der Namen der aktivierten CheckBoxes
- Code:
Private Sub cmdRead_Click()
Dim oCntr As msforms.Control
Dim sMsg As String
For Each oCntr In Controls
If TypeName(oCntr) = "CheckBox" Then
If oCntr Then
sMsg = sMsg & " " & oCntr.Name & vbLf
End If
End If
Next oCntr
If sMsg = "" Then
MsgBox "Es wurde keine CheckBox aktiviert!"
Else
MsgBox "Aktivierte CheckBoxes:" & vbLf & sMsg
End If
End Sub
Bedingtes Einlesen von ListBox-Elementen in eine zweite ListBoxBearbeiten
- Prozedur: cmdAction_Click
- Art: Sub
- Modul: Klassenmodul der UserForm
- Zweck: Ausgabe des Namens aktivierter CheckBox-Elemente einer UserForm
- Ablaufbeschreibung:
- Variablendeklaration
- Schleife über alle Listelemente des ersten Listenfelds
- Wenn das Listenelement den Bedingungen entspricht...
- Übergabe an das zweite Listenfeld
- Schleifenende
- Code:
Private Sub cmdAction_Click()
Dim iCounter As Integer
For iCounter = 0 To lstAll.ListCount - 1
If CDate(lstAll.List(iCounter)) >= CDate(txtStart) And _
CDate(lstAll.List(iCounter)) <= CDate(txtEnd) Then
lstFilter.AddItem lstAll.List(iCounter)
End If
Next iCounter
End Sub
Weblinks und weiterführende InhalteBearbeiten
- VBA For Schleife