Nehmen wir an, ich habe den folgenden Code:
Sub TestRangeLoop()
Dim rng As Range
Set rng = Range("A1:A6")
''//Insert code to loop through rng here
End Sub
Ich möchte in der Lage sein, eine Auflistung von Range
-Objekten für jede in rng
angegebene Zelle zu durchlaufen. Konzeptionell möchte ich das gerne so machen:
For Each rngCell As Range in rng
''//Do something with rngCell
Next
Ich weiß, dass ich dies lösen könnte, indem Sie rng.Address
analysieren und Range
-Objekte manuell erstellen, aber ich hoffe, dass es einen direkteren Weg gibt, bei dem kein String-Parsing erforderlich ist.
Sub LoopRange()
Dim rCell As Range
Dim rRng As Range
Set rRng = Sheet1.Range("A1:A6")
For Each rCell In rRng.Cells
Debug.Print rCell.Address, rCell.Value
Next rCell
End Sub
Sie können Range.Rows
, Range.Columns
oder Range.Cells
verwenden. Jede dieser Sammlungen enthält Range
-Objekte.
So können Sie das Beispiel von Dick modifizieren, um mit Rows
zu arbeiten:
Sub LoopRange()
Dim rCell As Range
Dim rRng As Range
Set rRng = Sheet1.Range("A1:A6")
For Each rCell In rRng.Rows
Debug.Print rCell.Address, rCell.Value
Next rCell
End Sub
Und Columns
:
Sub LoopRange()
Dim rCell As Range
Dim rRng As Range
Set rRng = Sheet1.Range("A1:A6")
For Each rCol In rRng.Columns
For Each rCell In rCol.Rows
Debug.Print rCell.Address, rCell.Value
Next rCell
Next rCol
End Sub
Um sich eine Anmerkung zu Dicks Antwort zu machen, ist dies richtig, aber ich würde nicht empfehlen, eine For Each-Schleife zu verwenden. For Each erstellt hinter den Kulissen eine temporäre Referenz auf die COM-Zelle, auf die Sie keinen Zugriff haben (die Sie benötigen würden, um sie zu entsorgen).
Weitere Informationen finden Sie im Folgenden:
Wie bereinige ich Excel-Interop-Objekte ordnungsgemäß?
Um das Problem zu veranschaulichen, versuchen Sie es mit dem For Each-Beispiel, schließen Sie Ihre Anwendung und sehen Sie sich den Task-Manager an. Sie sollten feststellen, dass noch eine Instanz von Excel ausgeführt wird (da nicht alle Objekte ordnungsgemäß entfernt wurden).
Eine sauberere Methode, um dies zu erreichen, ist die Abfrage der Tabelle mit ADO:
Ich stelle die Toten hier wieder auf, aber weil ein Bereich als "A: A" definiert werden kann, endet die Verwendung einer for-Schleife mit einer potentiellen Endlos-Schleife. Die Lösung ist, soweit ich weiß, die Do Until
-Schleife.
Do Until Selection.Value = ""
Rem Do things here...
Loop