2017-08-24 64 views
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 
+2

就我個人而言,我發現.Find方法可以是真正的flakey。 (它如何包裝可能很奇怪,有時它似乎以奇怪的順序返回)Yada Yada)。所以我努力工作,儘可能避免使用它。 如果你一次沒有得到一個單元值,你可能可以使你的原始搜索速度提高几個數量級,而只需一次調用即可將所有值存入內存緩衝區,然後循環這些值。然後再一次寫入緩衝區。 –

+0

如果有任何方法對數據進行排序,然後將其拆分爲更小的數組,則可以極大地加快數據的速度。從那裏,您可以比較陣列邊緣的數據並節省大量計算。 (例如,如果我正在查看從1到10,000的數據,然後對它進行數字排序,那麼我可以將它們分成10個1000個數組,而不必進行10000次計算,而只需要做10次(每個陣列一個,看看它是否在這些邊界內),然後1000通過陣列,導致必須更大的速度。 – BobtimusPrime

回答

1

注:這是不是答案,而是來想想,且佔用太多的空間評論。

這幾乎是我在「搜索和替換」中使用的格式。我不確定這是否會變得更快,但正如您所看到的,這與您的「發現」聲明並無太大區別。對我來說,它工作正常,但我沒有看成千上萬的記錄。希望這可以幫助你做出決定。

ThisWorkbook.Worksheets("Data").Columns("A:A").Replace What:=myValue1, Replacement:=myValue2, LookAt:=xlWhole, SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False