it-swarm.com.de

Durchlaufen Sie jede Zelle in einem Zellbereich, wenn Sie ein Range-Objekt erhalten

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.

49
Ben McCormack
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
80
Dick Kusleika

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
13
code4life

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:

http://technet.Microsoft.com/de-de/library/ee692882.aspx

3
Mark Avenius

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
0
Nielsvh