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. Im folgenden Verfahren wird beispielsweise dem Wert jeder Zelle im Bereich A1 bis A10 10 hinzugefügt.
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.
Sub SetArrayValue()
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
End Sub
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 rng
End Sub
Verwendung von „For Each...Next"-Schleife zur Iteration über eine VBA-Klasse
For Each... Nächste Schleifen durchlaufen nicht nur Arrays und Instanzen des Collection-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.
Erstellen Sie ein Klassenmodul in VBE (Visual Basic-Editor), und benennen Sie esCustomCollection.cc1
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
Exportieren Sie dieses Modul in eine Datei und speichern Sie es lokal. cc2
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
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.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
Importieren Sie die Datei, von der Sie das
'
Zeichen entfernt haben, wieder in VBE.cc4Fü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 Klassenmodulim 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ü Dateiwählen. |
[cc3] | Sie können ein Klassenmodul aus VBE entfernen, indem Sie die Option Element entfernen im Menü Dateiwä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.