VBAの関数「Replace」と、
Excelのシート関数「SUBSTITUTE」の違いを解説します。
同じところ
どちらも文字列を置換する関数です。
文字列を受け取って文字列を返す関数であることも同じで、
以下のコードはどちらも同じ文字列を返します。
置換後の文字列 = Replace("ABC", "A", "X") ' XBC 置換後の文字列 = WorksheetFunction.Substitute("ABC", "A", "X") ' XBC
第1引数~第3引数までは全く同じ関数だと思ってください。
違うところ
第4引数以降の細かい置換設定を行える機能の種類が異なります。
引数の種類としてはVBAのReplace関数の方が多く、
以下の3つの追加機能を有しています。
Replace(expression, find, replace, [ start], [ count], [ compare ]) Replace(元の文字列, 検索文字列, 置換後の文字列, 開始位置, 置換回数, 比較仕様)
start:開始位置は元の文字列の何文字目からを取得するかを設定できます。
置換後の文字列 = Replace("ABCDEFGA", "A", "X", 4) ' DEFGX
FIND関数などの開始位置と異なり、置換の有無にかかわらず結果値をカットするためご注意ください。
「4文字目以降に出てきた対象を置換(ABCDEFGX)」ではなく、
「元の文字列の4文字目以降だけを取ってから置換(DEFGA)」です。
compare:比較仕様では「バイナリ検索/テキスト検索」を選択することができます。
これは「Aとaを同じ文字として扱うか」という意味合いで、
デフォルトは「バイナリ検索(Aとaを区別)」ですが、
vbTextCompareを渡すことで「テキスト検索(Aとaを同一視)」で置換を実行できます。
置換後の文字列 = Replace("ABC", "a", "", , ,vbTextCompare) ' BC
ちなみにSUBSTITUTE関数は常に「バイナリ検索(Aとaを区別)」です。
最後のcount:置換回数では「何個目までを置換するか」を指定できます。
この仕様が後述のSUBSTITUTE関数と混同しやすいので注意してください。
置換後の文字列 = Replace("AAAAA", "A", "X") ' XXXXX 置換後の文字列 = Replace("AAAAA", "A", "X", , 1) ' XAAAA 置換後の文字列 = Replace("AAAAA", "A", "X", , 2) ' XXAAA 置換後の文字列 = Replace("AAAAA", "A", "X", , 3) ' XXXAA
続いてSUBSTITUTE関数ですが、こちらは第4引数までしかありません。
Subsutitute(文字列, 検索文字列, 置換文字列, [置換対象])
最後の[置換対象]はわかりづらいのですが「何個目を置換するか」という設定です。
WorksheetFunction.Substitute("AAAAA", "A", "X", 1) ' XAAAA WorksheetFunction.Substitute("AAAAA", "A", "X", 2) ' AXAAA WorksheetFunction.Substitute("AAAAA", "A", "X", 3) ' AAXAA
これがReplaceの引数countと似た挙動ですが、
微妙に違う結果になりますのでご注意ください。
使い分け
第4引数以降の機能のうち使いたい機能に応じて使い分けします。
WorksheetFunction.Substituteという記述は非常に長いので、
特になければ常にReplace関数を使っておけばOKですね。
SUBSTITUTE関数特有の機能は「○個目だけを置換」する機能なので、
その機能を使用したいときだけSUBSTITUTEを使うと思っておけばOKです。
置換後の文字列 = Replace("AAAAA", "A", "X", , 1) ' XAAAA 置換後の文字列 = Replace("AAAAA", "A", "X", , 2) ' XXAAA 置換後の文字列 = Replace("AAAAA", "A", "X", , 3) ' XXXAA WorksheetFunction.Substitute("AAAAA", "A", "X", 1) ' XAAAA WorksheetFunction.Substitute("AAAAA", "A", "X", 2) ' AXAAA WorksheetFunction.Substitute("AAAAA", "A", "X", 3) ' AAXAA