和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ReplaceメソッドとReplace関数の速度比較

セル内テキストを置換する場合、大きく分けて以下二つの方法があります。

  • RangeオブジェクトのReplaceメソッドを使用する方法
  • Replace関数を使用する方法

このどちらが高速なのかを検証します。


お忙しい方向けに先に結論を述べますと、

  • ReplaceメソッドよりもReplace関数の方が高速
  • ただし「セルへのアクセス」による速度低下の方が影響が大きいため、
    Replace関数を直接セルへ出力するループ文はかなり遅い
  • Replace関数の結果を一度配列に入れて、最後にセルに出力するのが最速
  • 置換対象が少ない場合はReplaceメソッドが高速化する

という結果になりました。

検証内容と詳細を見たい方はこのまま読み進めてください。

ソースコード

時間計測コード

このコードの中に検証コードを記載して実行します。

Sub Replaceメソッドを50000行に実行()

    Dim 開始時刻 As Double, 終了時刻 As Double
    開始時刻 = Timer

    ' この部分に各ソースコードを入れて実行

    終了時刻 = Timer
    Debug.Print "Replaceメソッドの実行時間:" & (終了時刻 - 開始時刻) & "秒"

End Sub

検証用データ

A~Jまでをランダムに10個並べた文字列を50,000行用意し、
"A"を"X"に置換する時間を計測します。

検証用データ

Range.Replaceメソッド

Range("A1:A50000").Replace "A", "X"

Replace関数

Dim R As Long
For R = 1 To 50000
    Cells(R, 1) = Replace(Cells(R, 1), "A", "X")
Next

Replace関数を一旦配列へ出力してからセルに一括出力

Dim Arr(1 To 50000, 1 To 1)

Dim R As Long
For R = 1 To 50000
    If InStr(Cells(R, 1), "A") > 0 Then
        Arr(R, 1) = Replace(Cells(R, 1), "A", "X")
    End If
Next

Range("A1:A50000").Value = Arr

計測結果

処理内容 処理時間
Range.Replaceメソッド 0.9531250秒
Replace関数 4.1640625秒
Replace関数+配列 0.3671875秒

考察

計測結果の通り、Replace関数+配列が最速となりました。

ReplaceメソッドよりもReplace関数の方が高速なのですが、
それ以上に「セルへのアクセス回数」による影響が大きいため、
配列を使用せず1セルずつ出力するとReplace関数の方が遅くなりますね。


Replaceメソッドでも50,000件やって1秒かかっていませんので、
よほど大量のデータでなければそこまで速度は気にする必要はなさそうです。


Replaceメソッドには「ユーザーが実行した置換ダイアログの影響を受ける」という弱点がありますが、上記の通りコードの短さは素晴らしい点がありますので、

  • サッと書きたいときはRangeオブジェクトのReplaceメソッド
  • しっかししたマクロを組みたいときは配列を活用してReplace関数

と使い分ければいいと思います。


なお余談になりますが、"A"を"X"に置換している部分を、
"AB"を"XX"、"ABC"を"XXX"と置換文字数を増やしていくと、
Range.Replaceメソッドだけが目に見えて高速化します。
(Replace関数はほとんど同じ実行時間)

処理内容 処理時間
"A"⇒"X" 0.953125秒
"AB"⇒"XX" 0.203125秒
"ABC"⇒"XXX" 0.078125秒


Replaceメソッドは「置換が実行されたときだけセルにアクセスしている」ようで、
滅多に置換対象が出現しない処理の場合は高速のようです。


50,000件中100件ほどしか対象がない置換というのも珍しい気がしますので、
あまり活用できる豆知識ではないですが覚えておいてください。