Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 当给定范围对象时,在单元格范围内的每个单元格中循环_Excel_Vba - Fatal编程技术网

Excel 当给定范围对象时,在单元格范围内的每个单元格中循环

Excel 当给定范围对象时,在单元格范围内的每个单元格中循环,excel,vba,Excel,Vba,假设我有以下代码: 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

假设我有以下代码:

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

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

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

下面是如何修改Dick的示例,以便使用

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

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

请注意Dick的答案,这是正确的,但我不建议使用For Each循环。For Each在您无权访问的后台创建一个对COM单元的临时引用(您需要该引用才能处理它)

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

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

处理此问题的更简洁方法是使用ADO查询电子表格:


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

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

如何使用这些属性创建循环。我一直在玩弄
范围
的属性,比如你提到的那些属性,我似乎不知道如何使用它们来提供我需要的信息。这非常有效,但我很惊讶它为什么有效,因为
单元格
只是一个
范围
对象。事实上,我从
中的
rRng
中为每行
删除了
.Cells
,它仍然有效。那么
Range
如何使它看起来像
Range
s的集合呢?非常感谢你的帮助!Cells属性是此上下文中的默认属性,因此它在没有它的情况下可以工作。在其他上下文中,Value属性是默认属性。所有的范围对象实际上都是包含范围对象的集合对象——我猜是无限的。范围是一个非常奇怪的对象,每次都会打破对象/对象收集的范式。但在大多数情况下,它只是起作用。:)谢谢你的额外见解。我希望我在大约4年前开始做VBA编程时,就知道“它只适用于范围”
。当我使用你的代码时,它正在成功运行,那么打印单元格的值或字符串如何?@BenMcCormack
事实上,我从rRng中为每一行删除了。单元格,它仍然有效。因为单个单元格也是一个范围对象,而且我们已经将rCell声明为范围,所以它能够遍历rRng range引用的所有单元格。不过,我认为这些警告不适用于这个问题。Ben正在使用VBA,可能与他正在使用的范围在同一个Excel实例中。我只是在使用VBA。我很欣赏这个警告的字眼,但这个特殊的解决方案是一次性的,我只需要通过一些单元格循环生成一些SQL代码,这样我就可以完成我的脚本和我的生活;你是对的:-)我以为你在使用VB.Net,完全被我自己的思想引入歧途。很抱歉。如果您没有使用上一次填充的单元格从下往上查看(例如
.range(.cells(1,1),.cells(.rows.count,1).end(xlup))
),那么请将其与整列和工作表的(例如
相交(.columns(1),.usedrange)
)或(例如
.cells(1,1).currentregion.columns(1))一起使用
)非常有效。
Do Until Selection.Value = ""
  Rem Do things here...
Loop