假设我有以下代码:
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
对象来解决这个问题,但我希望有一种更直接的方式不涉及字符串解析。
答案 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.Rows
,Range.Columns
或Range.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查询电子表格:
答案 3 :(得分:0)
我在这里复活了死者,但由于范围可以定义为“A:A”,因此每个循环使用a最终会产生潜在的无限循环。据我所知,解决方案是使用Do Until
循环。
Do Until Selection.Value = ""
Rem Do things here...
Loop