0
我正在循環查找具有〜5000行的列以查找特定的唯一記錄。一旦找到,我抵消並用範圍內的值替換它。這自然是相當資源密集型的,我發現它偶爾會凍結運行宏的舊機器。Excel VBA - 搜索+替換而不是每個循環?
我的想法是現在用一個搜索替換它&替換宏,但我想知道是否性能實際上更快,因爲檢查值的範圍內的每個單元格的過程仍然是相同的嗎?
這裏的代碼我到目前爲止。搜索&替換看起來像是值得嗎?
Sub Replace_List()
Dim rList As Range, cel As Range, n As Long
Dim fnd As Range
Dim fndFirst As String
Application.ScreenUpdating = False
With ThisWorkbook.Sheets("Settings")
Set rList = .Range("D4", .Range("D" & .Rows.Count).End(xlUp))
End With
For Each cel In rList
Set fnd = ThisWorkbook.Worksheets("Data").Columns("A:A").Find(What:=cel.Value, LookAt:=xlWhole)
If Not fnd Is Nothing Then
fndFirst = fnd.Address
Do
fnd.Offset(0, 1).Value = cel.Offset(0, 2).Value
Set fnd = ThisWorkbook.Worksheets("Data").Columns("A:A").FindNext(After:=fnd)
Loop While fnd.Address <> fndFirst
End If
Next
Application.ScreenUpdating = True
MsgBox "Replaced all items from the list.", vbInformation, "Replacements Complete"
End Sub
就我個人而言,我發現.Find方法可以是真正的flakey。 (它如何包裝可能很奇怪,有時它似乎以奇怪的順序返回)Yada Yada)。所以我努力工作,儘可能避免使用它。 如果你一次沒有得到一個單元值,你可能可以使你的原始搜索速度提高几個數量級,而只需一次調用即可將所有值存入內存緩衝區,然後循環這些值。然後再一次寫入緩衝區。 –
如果有任何方法對數據進行排序,然後將其拆分爲更小的數組,則可以極大地加快數據的速度。從那裏,您可以比較陣列邊緣的數據並節省大量計算。 (例如,如果我正在查看從1到10,000的數據,然後對它進行數字排序,那麼我可以將它們分成10個1000個數組,而不必進行10000次計算,而只需要做10次(每個陣列一個,看看它是否在這些邊界內),然後1000通過陣列,導致必須更大的速度。 – BobtimusPrime