给定Range对象时,循环遍历单元格区域中的每个单元格
假设我有以下代码:
Sub TestRangeLoop() Dim rng As Range Set rng = Range("A1:A6") ''//Insert code to loop through rng here End Sub
我希望能够遍历rng
指定的每个单元格的Range
对象的集合。 从概念上讲,我想这样做:
For Each rngCell As Range in rng ''//Do something with rngCell Next
我知道我可以通过手动parsingrng.Address
和构buildRange
对象来解决这个问题,但我希望有一个更直接的方式,不涉及stringparsing。
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
你可以使用Range.Rows
, Range.Columns
或Range.Cells
。 每个集合都包含Range
对象。
以下是如何修改迪克的示例,以便使用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
要记下迪克的答案,这是正确的,但我不会推荐使用For Each循环。 For Each创build了一个临时引用,指向您无法访问的场景后面的COM单元(为了处理它,您将需要这个引用)。
请参阅以下内容以获得更多讨论
如何正确清理Excel互操作对象?
为了说明这个问题,请尝试For Each示例,closures应用程序,然后查看任务pipe理器。 您应该看到Excel的实例仍在运行(因为所有对象都没有正确处理)。
处理这个问题的更简单的方法是使用ADO查询电子表格:
我在这里复活死人,但是因为一个范围可以定义为“A:A”,所以对每个循环使用a最后都会有一个潜在的无限循环。 就我所知,解决scheme是使用Do Until
循环。
Do Until Selection.Value = "" Rem Do things here... Loop