[英]Optimizing loop performance in VBA
这比出于学术兴趣而不是实际解决方案的需要-我最近写了一些代码,对一个大文件进行大量过滤/排序/删除重复项,但是当我逐步遍历代码时,这个循环是主要瓶颈,我想了解为什么这是如此糟糕,以及为什么内置函数(例如filter和sort)在执行更困难的操作时似乎能更快地工作。
For i = 2 To nRows
If (Cells(i, 1) <> Cells(i - 1, 1) Or Cells(i, 2) <> Cells(i - 1, 2)) _
And (Cells(i, 1) <> Cells(i + 1, 1) Or Cells(i, 2) <> Cells(i + 1, 2)) Then
Rows(i).EntireRow.Delete
i = i - 1
nRows = nRows - 1
End If
Next i
VBA中的工作表调用非常慢(与数组等相比)。 每次循环时,仅IF语句就进行8次工作表调用。 这行:Rows(i).EntireRow.Delete-每次循环时进行4个工作表调用。
更快的解决方案是将所有数据读取到数组中-在数组上进行所有处理过滤等操作,然后将数组输出回到工作表中。
关于SO的速度比较,有一个详细的答案-但我找不到它。 如果有人可以请添加为评论
好吧,当您遍历每一行并检查每一行的逻辑时,会产生很多开销。 您可以执行数百,数千甚至数十万次操作。 当应用过滤器,删除不需要的内容,取消过滤和排序时,您实际上只在这种过程中执行了四个步骤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.