2017-06-15 84 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

那麼,當你通過每一行循環,並檢查每一行的邏輯,有很多開銷。您可以執行數百次,數千次甚至數十萬次的操作。當你應用一個過濾器時,刪除你不想要的東西,不要過濾和排序,你實際上只在這個過程中執行四個步驟。