私は特定の一意のレコードを探して〜5000行の列をループしています。いったん見つけられると、私はそれをオフセットして範囲の値で置き換えます。これは当然ながらかなりリソース集約的で、マクロを実行している古いマシンを時折フリーズすることがわかった。Excel VBA - For Each LoopではなくSearch + Replace?
私の考えは今これを検索&に置き換えますが、値の範囲内の各セルをチェックするプロセスが同じであるため、実際にパフォーマンスが向上するのだろうかと疑問に思っていますか?
これまでのコードはここにあります。検索はどのようにして&のように見えますか?
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メソッドが本当にフレークである可能性があります。 (ラップの仕方は変わっているかもしれません。時には変な順序で物を返すように見えるかもしれません。だから可能ならばそれを使うのを避けるために頑張っています。 一度に1つのセルの値を取得しない場合は、元の検索を数桁速くすることができますが、代わりに1回の呼び出しですべての値を1回のショットでメモリバッファに入れてからこれらの値をループします。そのバッファをもう一度一度に書き戻します。 –
データをソートして小さな配列に分割する方法があれば、それを大幅に高速化できます。そこから、配列の端にあるデータと比較して、多くの計算量を節約することができます。 (例えば、1〜10,000のデータを調べて数値的に並べ替えると、1000個の配列に分割することができます)比較すると、10,000回の計算をするのではなく、10 1つは各アレイの境界内にあるかどうかを確認するために1つずつ)、次にアレイを通過するためには1000が必要です。 – BobtimusPrime