Microsoft Excel

Excel und VBA: Formeln, Programmierung, Lösungen

Inhalt dieser Seite

Über Schleifen

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

Schleifentypen-Beispiele

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

  • Zählschleifen

    • For...To...Next-Schleife
      • 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
      • 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
      • 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 -2
              MsgBox iCounter
           Next iCounter
        End Sub
        
    • While ... Wend-Schleife
      • 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
      • 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
        
  • Vorangestellte Bedingungsprüfung

    • Do ... While-Schleife
      • 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
      • 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
        
        
  • Nachgestellte Bedingungsprüfung

    • Do ... Until-Schleife
      • 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
      • Do ... Loop ... Until-Schleife
        • 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

    • Einsatz bei Arbeitsmappen- und Tabellenobjekte

      • Ausgabe der Arbeitsblattnamen der aktiven Arbeitsmappe
        • 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
        • 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
        • 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
        • 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 wkb.Styles
                MsgBox oStyle.Name
             Next oStyle
          End Sub
          
      • Ausgabe der einzelnen Zelladressen eines vorgegebenen Bereiches
        • 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

      • Prüfung, welches Optionsfeld in einer vorgegebenen Gruppe von Optionsfeldgruppen aktiviert ist
        • 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

      • Prüfung, welche CheckBox-Elemente einer UserForm aktiviert sind
        • Prozedur: cmdRead_Click
        • Art: Sub
        • Modul: Klassenmodul der UserForm
        • Zweck: Ausgabe des Namenn 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
        • Prozedur: cmdAction_Click
        • Art: Sub
        • Modul: Klassenmodul der UserForm
        • Zweck: Ausgabe des Namenn 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