这比实际解决方案的任何需要更符合学术兴趣 - 我最近编写了一些代码,它在一个巨大的文件中执行了大量的过滤器/排序/删除重复项,但是当我逐步完成代码时看起来这个循环是主要的瓶颈,我想要理解为什么这么糟糕,以及为什么像过滤器和排序这样的内置函数似乎能够更快地完成更困难的操作。
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
答案 0 :(得分:2)
VBA中的表单调用非常慢(与数组等相比)。 每次循环时,您的IF语句单独进行8次表单调用。 这一行:Rows(i).EntireRow.Delete - 每次循环时进行4次表格调用。
更快的解决方案是将所有数据读入数组 - 对数组执行所有处理过滤等,然后将数组输出回工作表。
对SO的速度比较有一个详细的答案 - 但我找不到它。如果有人可以请添加为评论
答案 1 :(得分:0)
好吧,当你遍历每一行,并检查每一行的逻辑时,会有很多开销。您可以执行数百,数千甚至数十万次操作。当您应用过滤器时,删除您不想要的,不过滤的和排序的,您实际上只是在这种过程中执行了四个步骤。