VBA in Excel/ Beispiele für Schleifen
Siehe auch: VBA in Excel/_Schleifen
Allgemeines / Einleitung
BearbeitenSchleifen 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-Beispiele
BearbeitenJeder Schleifentyp kann weitere Bedingungsprüfungen enthalten. Bei Zählschleifen kann die Schrittgröße festgelegt werden; der Default-Wert ist 1.
Zählschleifen
BearbeitenFor-To-Next-Schleife
Bearbeiten- 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 vorn
Bearbeiten- 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ück
Bearbeiten- 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üfung
BearbeitenWhile ... Wend-Schleife
Bearbeiten- 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-Schleife
Bearbeiten- 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-Schleife
Bearbeiten- 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-Schleife
Bearbeiten- 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üfung
BearbeitenDo-Until-Schleife
Bearbeiten- 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üfung
BearbeitenDo-Loop-Until-Schleife
Bearbeiten- 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 Beispiele
BearbeitenEinsatz bei Arbeitsmappen- und Tabellenobjekte
BearbeitenAusgabe der Arbeitsblattnamen der aktiven Arbeitsmappe
Bearbeiten- 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 Arbeitsmappen
Bearbeiten- 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 Arbeitsmappe
Bearbeiten- 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 Arbeitsmappe
Bearbeiten- 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 Bereiches
Bearbeiten- 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-Objekten
BearbeitenPrüfung, welches Optionsfeld in einer vorgegebenen Gruppe von Optionsfeldgruppen aktiviert ist
Bearbeiten- 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-Objekten
BearbeitenPrüfung, welche CheckBox-Elemente einer UserForm aktiviert sind
Bearbeiten- 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 ListBox
Bearbeiten- 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 Inhalte
Bearbeiten- VBA For Schleife