在 VBA 中,众所周知,For Each
循环会比 Collection
循环更快地遍历 For
,两种循环方法之间的时间差呈指数增长(?)作为 Collection
大小的函数。 (当然,这假设迭代在 Collection
成员上是“有序的”。)
为什么速度更快? For Each
循环如何比通过 Collection
中的索引更快地访问项目?
答案 0 :(得分:0)
您认为 For Each
比 For 1 To
快的假设是错误的。两者都循环遍历一组他们可以以相同速度完成的数字。
在 For Each
变体中,数字标识集合中的对象,例如 Sheets(1)、Sheets(2)、Sheets(3) 等。这些工作表不会在循环中加载甚至访问。它们只是被引用。
相比之下,For i = 1 to 3: Set Ws = Sheets(i)
只会创建对工作表的引用。
相应地,不同之处在于您对引用对象的处理方式,而不是您引用它们的方式。 For Each
经常作为稍微简单的代码出现。但是,如果您想参考 ActiveSheet.Cells(3)
,您确实需要知道这将是 C1 还是 A3,并且明显更容易编码是以牺牲透明度为代价的。我把它当作一个品味问题。
Dim Arr As Variant
Dim R As Long
Arr = Range("A1:A20")
For R = 1 To UBound(Arr)
Debug.Print Arr(R, 1)
Next R
比
快得多Dim Rng As Range
Dim Cell As Range
Set Rng = Range("A1:A20")
For Each Cell in Rng
Debug.Print Cell.Value
Next Cell
但这是因为第二个代码相对于第一个代码段的一次引用了工作表 20 次。也许这就是您一直在阅读的差异。