如何解决VBA:为什么 For Each 循环比 For 循环快?
在 VBA 中,众所周知,For Each
循环会比 Collection
循环更快地遍历 For
,两种循环方法之间的时间差呈指数增长(?)作为 Collection
大小的函数。 (当然,这假设迭代在 Collection
成员上是“有序的”。)
为什么速度更快? For Each
循环如何比通过 Collection
中的索引更快地访问项目?
解决方法
您认为 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 次。也许这就是您一直在阅读的差异。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。