Verwenden von For Each...Next-Anweisungen

For Each...Next-Anweisungen wiederholen einen Block von Anweisungen für jedes Objekt in einer Auflistung oder jedes Element in einem Datenfeld. Visual Basic legt bei jedem Ausführen der Schleife automatisch eine Variable fest. Die folgende Prozedur fügt beispielsweise dem Wert jeder Zelle im Bereich A1 bis A10 10 hinzu.

Sub Add10ToAllCellsInRange()
    Dim rng As Range
    For Each rng In Range("A1:A10")
        rng.Value = rng.Value + 10
    Next
End Sub

Der folgende Code durchläuft jedes Element eines Datenfelds und stellt den Wert jedes Elements auf den Wert der Indexvariablen I ein.

Dim TestArray(10) As Integer, I As Variant 
For Each I In TestArray 
 TestArray(I) = I 
Next I 

Schleifendurchlauf für einen Zellenbereich

Verwenden Sie eine For Each...Next Next-Schleife, um einen Schleifendurchlauf durch die Zellen in einem Bereich durchzuführen. Die folgende Prozedur durchläuft den Bereich A1:D10 in Tabelle1 und stellt jede Zahl, deren absoluter Wert kleiner als 0,01 ist auf 0 (Null) ein.

Sub RoundToZero() 
 For Each rng in Range("A1:D10") 
 If Abs(rng.Value) < 0.01 Then rng.Value = 0 
 Next 
End Sub

Verlassen einer "For Each...Next"-Schleife, bevor sie beendet wurde

Sie können eine For Each...Next-Anweisung mithilfe der Exit For-Anweisung verlassen. Wenn beispielsweise ein Fehler auftritt, verwenden Sie die Exit For-Anweisung im True-Anweisungsblock einer If...Then...Else-Anweisung oder einer Select Case-Anweisung, die spezifisch auf diesen Fehler prüft. Tritt der Fehler nicht auf, entspricht die If…Then…Else-Anweisung dem Wert False, und die Schleife wird wie erwartet ausgeführt.

In dem folgenden Beispiel wird nach der ersten Zelle im Bereich A1:B5 gesucht, die keine Zahl enthält. Wird eine solche Zelle gefunden, wird eine Meldung angezeigt, und Exit For beendet die Schleife.

Sub TestForNumbers() 
 For Each rng In Range("A1:B5") 
  If IsNumeric(rng.Value) = False Then 
   MsgBox "Cell " & rng.Address & " contains a non-numeric value." 
   Exit For 
  End If 
 Next c 
End Sub

Verwendung von „For Each...Next"-Schleife zur Iteration über eine VBA-Klasse

For Each...Next-Schleifen durchlaufen nicht nur über Arrays und Instanzen des Sammlung -Objekts. For Each...Next-Schleifen können auch über eine VBA-Klasse durchlaufen, die Sie geschrieben haben.

Es folgt ein Beispiel, das zeigt, wie Sie dies tun können.

  1. Erstellen Sie ein Klassenmodul in VBE (Visual Basic-Editor), und benennen Sie es CustomCollection.cc1

  2. Fügen Sie den folgenden Code in das neu erstellte Modul ein.

    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  3. Exportieren Sie dieses Modul in eine Datei und speichern Sie es lokal. cc2

  4. Nachdem Sie das Modul exportiert haben, öffnen Sie die exportierte Datei mit einem Text-Editor (die Notepad-Software von Windows sollte ausreichen). Der Inhalt der Datei sollte nun wie folgt aussehen.

    VERSION 1.0 CLASS
    BEGIN
    MultiUse = -1  'True
    END
    Attribute VB_Name = "CustomCollection"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  5. Entfernen Sie mit dem Text-Editor, der ' Zeichen von der ersten Zeile unter demProperty Get NewEnum() As IUnknown Text in der Datei. Speichern Sie die geänderte Datei.

  6. Zurück in VBE, entfernen Sie die Klasse, die Sie aus Ihrem VBA-Projekt erstellt haben, und wählen Sie nicht, sie zu exportieren, wenn aufgefordert. cc3

  7. Importieren Sie die Datei, von der Sie das ' Zeichen entfernt haben, wieder in VBE.cc4

  8. Führen Sie den folgenden Code aus, um festzustellen, ob Sie nun über Ihre benutzerdefinierte VBA-Klasse, die Sie geschrieben haben, durchlaufen können, indem Sie sowohl VBE als auch einen Text-Editor verwenden.

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
    MsgBox Element
    Next
    
Fußnoten Beschreibung
[cc1] Erstellen Sie können ein Klassenmodul erstellen, indem Sie die Option Klassenmodul im Menü Einfügen wählen. Sie können ein Klassenmodul umbenennen, indem Sie seine Eigenschaften im Fenster Eigenschaften ändern.
[cc2] Sie können das Dialogfenster Datei exportieren aktivieren, indem Sie die Option Datei exportieren im Menü Datei wählen.
[cc3] Sie können ein Klassenmodul aus VBE entfernen, indem Sie die Option Element entfernen im Menü Datei wählen.
[cc4] Sie können eine externe Klassenmodul-Datei importieren, indem Sie das Dialogfenster Datei importieren aktivieren (wählen Sie Datei importieren im Menü Datei).

Siehe auch

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.