2017-06-15 83 views
1

这比实际解决方案的任何需求都更为出乎学术兴趣 - 我最近编写了一些代码,可以处理大量文件中的一系列过滤器/排序/删除重复项,但由于我正在逐步完成代码,看起来这个循环似乎是主要瓶颈,我想了解为什么这么糟糕,以及为什么像过滤器和分类这样的内置函数似乎能够更快速地完成更困难的操作。在VBA中优化循环性能

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 
+5

VBA中的表调用非常缓慢(与数组或类似)。每次循环时,您的IF语句都会打印8张表格。更快的解决方案是将所有数据读取到数组中 - 对数组执行所有处理过滤等操作,然后将数组输出到表单中。 – 99moorem

+0

@ 99moorem谢谢,我试了一下,并得到了显着的加速。如果你要写评论作为答案,我会接受(否则我会像社区维基答案一样)。 – Nitin

+0

https://stackoverflow.com/questions/30959315/excel-vba-performance-1-million-rows-delete-rows-containing-a-value-in-less – Slai

回答

1

VBA中的表单调用非常慢(与数组或类似情况相比)。 您的IF语句每次循环时都会打8页电话。 此行:行(i).EntireRow.Delete - 每次循环时进行4次表单调用。

更快的解决方案是将所有数据读入数组 - 对数组执行所有处理过滤等操作,然后将数组输出到表单中。

对此有一个详细的答案与速度比较SO - 但我找不到它。如果任何人可以请添加评论

0

那么,当你通过每一行循环,并检查每一行的逻辑,有很多开销。您可以执行数百次,数千次甚至数十万次的操作。当你应用一个过滤器时,删除你不想要的东西,不要过滤和排序,你实际上只在这个过程中执行四个步骤。