Zum Inhalt springen

VBA in Excel/ Beispiele für Schleifen

Aus Wikibooks


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]