给定Range对象时,遍历一系列单元格中的每个单元格

时间:2010-10-06 17:48:54

标签: excel vba excel-vba

假设我有以下代码:

Sub TestRangeLoop()
    Dim rng As Range
    Set rng = Range("A1:A6")

    ''//Insert code to loop through rng here
End Sub

我希望能够为Range中指定的每个单元格迭代rng个对象的集合。从概念上讲,我想这样做:

For Each rngCell As Range in rng
     ''//Do something with rngCell
Next

我知道我可以通过解析rng.Address并手动构建Range对象来解决这个问题,但我希望有一种更直接的方式不涉及字符串解析。

4 个答案:

答案 0 :(得分:81)

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

答案 1 :(得分:13)

您可以使用Range.RowsRange.ColumnsRange.Cells。每个集合都包含Range个对象。

以下是修改Dick示例以便与Rows一起使用的方法:

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

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

答案 2 :(得分:3)

要记下Dick的答案,这是正确的,但我不建议使用For Each循环。 For Each在您无法访问的幕后创建对COM Cell的临时引用(为了处理它,您需要它)。

有关更多讨论,请参阅以下内容:

How do I properly clean up Excel interop objects?

要说明此问题,请尝试For Each示例,关闭应用程序,然后查看任务管理器。您应该看到Excel的实例仍在运行(因为所有对象都没有正确处理)。

更清晰的方法是使用ADO查询电子表格:

http://technet.microsoft.com/en-us/library/ee692882.aspx

答案 3 :(得分:0)

我在这里复活了死者,但由于范围可以定义为“A:A”,因此每个循环使用a最终会产生潜在的无限循环。据我所知,解决方案是使用Do Until循环。

Do Until Selection.Value = ""
  Rem Do things here...
Loop