2010-10-06 75 views
45

比方说,我有以下代码时:遍历的单元格区域中的每个单元赋予了Range对象

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对象解决这个问题,但我希望有,不涉及一个更直接的方式字符串解析。

回答

72
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

这个工作完美,但我为此感到诧异,因为'Cells'只是一个'Range'对象。事实上,我从'For Each'行的'rRng'中删除了'.Cells',它仍然有效。 'Range'如何让它看起来像是'Range'的集合?非常感谢你的帮助! – 2010-10-06 18:25:19

+7

http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/ Cells属性是此上下文中的默认属性,所以这就是没有它的原因。在其他上下文中,Value属性是默认属性。所有Range对象都是包含Range对象的集合对象 - 我想是无限的。范围是一个绝对奇怪的对象,并且每次都打破对象/对象收集范例。但在大多数情况下,它只是起作用。 :) – 2010-10-06 19:46:50

+0

感谢您的额外见解。我希望在大约4年前,当我开始进行VBA编程时,我已经了解到“这只适用于”Range .-)。 – 2010-10-07 01:21:37

11

您可以使用Range.Rows,Range.ColumnsRange.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 
+0

你将如何使用这些属性来创建一个循环。我一直在玩'Range'的属性,比如你提到的属性,我似乎无法弄清楚如何使用它们来给我提供我需要的信息。 – 2010-10-06 18:12:53

2

为了让迪克的回答一张纸条,这是正确的,但我不会推荐使用For Each循环。 For Each在幕后创建一个临时引用,指向您无权访问的场景(为了处置它,您将需要这些场景)。

有关详情,请讨论以下事项:

How do I properly clean up Excel interop objects?

为了说明这个问题,请尝试对于每一个例子,关闭应用程序,并期待在任务管理器。您应该看到Excel的一个实例仍在运行(因为所有对象都没有正确处理)。

一个更清洁的方式来处理,这是通过查询表格ADO:

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

+0

但我不认为这些警告适用于这个问题。 Ben正在使用VBA,可能在与他正在使用的Ranges相同的Excel实例中。 – jtolle 2010-10-06 18:25:21

+2

我只是使用VBA。我很欣赏谨慎的说法,但是这个特殊的解决方案是我只需要通过一些单元来生成一些SQL代码就可以完成我的脚本和移动与我的生活多种多样。 – 2010-10-06 18:31:26

+3

哎呦;你是对的:-)我认为你正在使用VB.Net,并完全被我自己的思想误入歧途。对于那个很抱歉。 – 2010-10-06 18:33:15

0

我复活死在这里,但因为范围可以被定义为“A:A”,使用每个循环的a结束时都会有一个潜在的无限循环。就我所知,解决方案是使用Do Until循环。

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

如果你没有使用最后填充的单元格(例如'.range(.cells(1,1),.cells(.rows.count,1).end(xlup))'),然后使用[Intersect方法](https://msdn.microsoft.com/en-us/library/office/aa195772(v = office.11​​).aspx)与完整列和工作表的[.UsedRange属性](https:/ /msdn.microsoft.com/en-us/library/office/ff840732.aspx)(例如'Intersect(.columns(1),.usedrange)')或可能[Range.CurrentRegion属性](https:// msdn .microsoft.com/en-us/library/office/ff196678.aspx)(例如'.cells(1,1).currentregion.columns(1)')是非常有效的。 – Jeeped 2015-12-09 00:51:41

相关问题