VBA in Excel/ Beispiele für Schleifen


Siehe auch: VBA in Excel/_Schleifen

Allgemeines / Einleitung

Bearbeiten

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-Beispiele

Bearbeiten

Jeder Schleifentyp kann weitere Bedingungsprüfungen enthalten. Bei Zählschleifen kann die Schrittgröße festgelegt werden; der Default-Wert ist 1.

Zählschleifen

Bearbeiten

For-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

Bearbeiten

While ... 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

Bearbeiten

Do-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

Bearbeiten

Do-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

Bearbeiten

Einsatz bei Arbeitsmappen- und Tabellenobjekte

Bearbeiten

Ausgabe 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

Bearbeiten

Prü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

Bearbeiten

Prü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
Bearbeiten