2017-08-24 6 views
0

私は特定の一意のレコードを探して〜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 
+2

個人的には、.Findメソッドが本当にフレークである可能性があります。 (ラップの仕方は変わっているかもしれません。時には変な順序で物を返すように見えるかもしれません。だから可能ならばそれを使うのを避けるために頑張っています。 一度に1つのセルの値を取得しない場合は、元の検索を数桁速くすることができますが、代わりに1回の呼び出しですべての値を1回のショットでメモリバッファに入れてからこれらの値をループします。そのバッファをもう一度一度に書き戻します。 –

+0

データをソートして小さな配列に分割する方法があれば、それを大幅に高速化できます。そこから、配列の端にあるデータと比較して、多くの計算量を節約することができます。 (例えば、1〜10,000のデータを調べて数値的に並べ替えると、1000個の配列に分割することができます)比較すると、10,000回の計算をするのではなく、10 1つは各アレイの境界内にあるかどうかを確認するために1つずつ)、次にアレイを通過するためには1000が必要です。 – BobtimusPrime

答えて

1

注:これはない答えているのではなく、熟考するもの、およびコメントのためにあまりにも多くの部屋を取ります。

これは、「検索と置換」で使用する形式とほぼ同じです。私はこれがどんな速さでもなくても終わるかどうかはわかりませんが、あなたが見ることができるように、それはあなたの "find"ステートメントとあまり違いはありません。私にとってはうまくいくが、私は何千もの記録を見ていない。これがあなたの決定に役立つことを願っています。

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