繁体   English   中英

在VBA中优化循环性能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM