下面的VBA代碼提供了一個簡單的框架,您可以自定義以滿足您的需求。它包含了許多針對您的問題的評論中提到的優化,例如關閉屏幕更新並將比較從工作表移至數組。
你會注意到宏做了一個相當大的比較和替換。我使用的數據集是在A1:Y100000範圍內的1到1000之間的250萬個隨機數。如果一個數字大於250且小於500,我用0替換它。這需要替換數據集中所有數字的24.9%。
Sub ReplaceExample()
Dim arr() As Variant
Dim rng As Range
Dim i As Long, _
j As Long
Dim floor as Long
Dim ceiling as Long
Dim replacement_value
'assign the worksheet range to a variable
Set rng = Worksheets("Sheet2").Range("A1:Y100000")
floor = 250
ceiling = 500
replacement_value = 0
' copy the values in the worksheet range to the array
arr = rng
' turn off time-consuming external operations
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
'loop through each element in the array
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
'do the comparison of the value in an array element
'with the criteria for replacing the value
If arr(i, j) > floor And arr(i, j) < ceiling Then
arr(i, j) = replacement
End If
Next j
Next i
'copy array back to worksheet range
rng = arr
'turn events back on
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
我做了不同的選擇一些性能測試編碼這個簡單的比較和替換,與我期望與他人VBA性能結果一致的結果。我每次運行10次,計算每次運行所用的時間,並平均計算10次。
結果揭示了大的影響,使用陣列可以具有,尤其是當數據集很大:相對於所測試的代碼和變化的工作表單元格值一個接一個,將前述數組運算 - 將數據集從工作表複製到數組中,比較和更改數組值,然後將數組結果寫回工作表 - 在這種情況下,平均運行時間從3.6分鐘減少到4分鐘到4秒。
雖然關閉外部事件的優化在工作表操作中產生了明顯的差異,運行時間減少了22%,但是當大多數計算工作是基於數組的時候,這些優化幾乎沒有影響。
我自己不是Excel或任何「編程」(或所謂的編程),你可以在其中做的任何大風扇。我會建議在訪問時導入它(雖然它不會好得多,但仍然可以),假設你可以編寫簡單的查詢並安裝訪問 –
Put'Application。ScreenUpdating = false「,然後是」Application.ScreenUpdating = true「。這應該會給你帶來顯着的性能提升。 – Jack
同時將'application.calculation'設置爲手動(完成時返回自動) –