文字列を置換するReplace関数の使い方と具体例

今回の目標

「この文字列を他の文字に差し替えたい!」や「半角文字じゃなくて全角文字だった!」、「この文字列の一部を削除したい!」と、思ったあなたへ。
この記事では、Replace関数の使い方からエラーの対処方法まで、まとめて丁寧に解説します! 基本的なだけでなく、実務で使える実例集付きです。

目標リスト

  • 文字列を置換できるようになる
  • 文字列の中から、特定の文字列だけを削除できるようになる
  • Replace関数の処理速度を早くする方法を知る
  • Replace関数で発生するエラーと対処方法を知る

説明

Replace関数とは?

Replace関数は、文字列の中から指定した文字列を検索し、その検索した文字列があったら、置換して返します。
例えば「ABCD」の中から「A」を検索して「1」に置換すると「1BCD」を返します。
「ABCD」の中から「BC」を検索して「1」にすると「A1D」を返します。
実用的な例は、電話番号「00-1234-5678」のハイフンをブランクに置換して、「0012345678」にできます。

Replace関数は、置換後の文字をブランクにすると、文字を削除することができます。
「ABCD」を「A」を検索して、ブランクに置換すると「BCD」を返します。
「ABCD」を「BC」を検索して、ブランクに置換すると「AD」を返します。

特殊なケースですが、「Null」の場合は、Nullが返ります。

Replace関数の構文と引数一覧

Replace関数の構文と引数一覧です。

Replace関数の構文

Replace(expression, find, replace, start, count, compare)

Replace関数の引数一覧

引数省略説明
expression不可置換処理を行う文字列式。
find不可検索する文字列。
replace不可置き換える文字列。
start可能元の文字列(expression)を何文字目から検索及び置換するか。規定値は、1(1文字目から検索・置換をする)
count可能元の文字列(expression)の先頭から指定した回数、文字列を置換する。規定値は、-1(すべて置換する)
compare可能文字種(大文字・小文字、全角・半角 等)が違っていても置換をするか。規定値は0 (文字種が違う場合、置換しない)

一部、Microsoft社のリファレンス【Replace関数】を参照しています。
【Microsoft公式】
Replace 関数 (Visual Basic for Applications)

実用サンプル

1.文字の置換

文字列の置換(置き換え)について解説します。

1-1.文字を置換する

Replace関数の第一引数に「置換前の文字列」、第二引数に「置換したい文字列」、第三引数に「置換後の文字列」を設定します。

サンプルコード

Sub SampleReplace1_1()
    Dim repBefore As String
    Dim repAfter As String
    
    repBefore = "神奈川県町田市原町田1丁目"
    repAfter = Replace(repBefore, "神奈川県", "東京都")
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:神奈川県町田市原町田1丁目
置換後:東京都町田市原町田1丁目

1-2.「㈱」を「株式会社」に置換する

Replace関数の第一引数に会社名、第二引数に「㈱」、第三引数に「株式会社」を設定します。

サンプルコード

Sub SampleReplace1_2()
    Dim repBefore As String
    Dim repAfter As String
    
    repBefore = "㈱タナカ電機"
    repAfter = Replace(repBefore, "㈱", "株式会社")
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:㈱タナカ電機
置換後:株式会社タナカ電機

1-3.「/」を「¥」に統一する

Replace関数の第一引数にパス、第二引数に「/」、第三引数に「¥」を設定します。

パスを変更する時などのディレクトリの区切り(フォルダの区切り)は「¥」か「/」で区切ることが出来ます。 プログラムでパス(フォルダ)を操作する時、区切る文字が異なると、「¥」と「/」の両方の処理を作る必要があります。 これを避けるため、「¥」で統一すると、「¥」だけの処理で済みます。

サンプルコード

Sub SampleReplace1_3()
    Dim repBefore As String
    Dim repAfter As String
    
    repBefore = "C:\Users/Yamada\Desktop/aaa.txt"
    repAfter = Replace(repBefore, "/", "\")
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:C:¥Users/Yamada¥Desktop/aaa.txt
置換後:C:¥Users¥Yamada¥Desktop¥aaa.txt

1-4.先頭の●文字以降の文字の抽出、その文字列を特定文字で置換

Replace関数の第四引数(start)を指定することで、特定の位置以降のみ置換することが出来ます。
文字「AB_AB」の「A」を「B」に置換すると「BB_BB」となりますが、第四引数に2を指定すると2文字目以降を置換対象とするため「AB_BB」となります。

サンプルコード

Sub SampleReplace1_4()
    Dim repBefore As String
    Dim repAfter As String
    
    repBefore = "ABC_ABC_ABC_ABC"
    repAfter = Replace(repBefore, "A", "", Start:=6)
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前 : ABC_ABC_ABC_ABC
置換後:BC_BC_BC

1-5.特定の回数だけ置換する

Replace関数の第5引数(count)を指定すると、置換する回数を制限することが出来ます。
文字「ABABAB」の「A」を「B」に置換すると「BBBBBB」となりますが、第5引数に2を指定すると先頭から2回のみ置換し、「BBBBAB」となります。

サンプルコード

Sub SampleReplace1_5()
    Dim repBefore As String
    Dim repAfter As String
    Dim num As Long
    
    repBefore = "ABC_ABC_ABC_ABC"
    '最初の2回のみ置換する
    repAfter = Replace(repBefore, "A", "", Count:=2)
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:ABC_ABC_ABC_ABC
置換後:BC_BC_ABC_ABC

2.文字の削除

文字の削除について説明します。
消したい文字をブランクに置換することで、文字を削除することが出来ます。

2-1.郵便番号や、電話番号の「-」を削除する

Replace関数の第一引数に郵便番号(電話番号)を、第二引数に「-」、第三引数にブランクを設定します。

サンプルコード

Sub SampleReplace2_1()
    Dim repBefore As String
    Dim repAfter As String
    
    repBefore = "012-3456"
    repAfter = Replace(repBefore, "-", "")
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:012-3456
置換後:0123456

2-2.改行コードを削除する

Replace関数の第一引数に文字列を、第二引数に改行コード、第三引数にブランクを設定すると改行コードを削除できます。
第二引数に「vbNewLine」を指定すると削除できない場合があります。
改行コードは標準の「vbCrLf」、旧Macで使用されていた「vbCr」、Unix系で使用されている「vbLf」の3種類があります。 Replace関数で「vbNewLine」を指定すると、削除できるのは(通常は)vbCrLf であり、他の改行コード(vbLf、vbCr)は削除されません。 そのため、文字列内の改行を確実に削除するには、「vbCrLf」「vbCr」「vbLf」の3種類すべてを個別に置換(削除)する必要があります。

サンプルコード

Sub SampleReplace2_2()
    Dim repBefore As String
    Dim repAfter As String
    
    repBefore = "ABC" & vbNewLine & "ABC" & vbNewLine & "ABC"
    repAfter = Replace(repBefore, vbCrLf, "")  '標準
    repAfter = Replace(repAfter, vbCr, "")     '旧Mac
    repAfter = Replace(repAfter, vbLf, "")     'Unix系
    
    Debug.Print "【置換前】" & vbNewLine & repBefore
    Debug.Print "【置換後】" & vbNewLine & repAfter
End Sub

出力結果

【置換前】
ABC
ABC
ABC
【置換後】
ABCABCABC

3.その他テクニック

異なる文字種(大文字・小文字、全角・半角)

3-1.大文字・小文字、かな・カナ、全角・半角をまとめて置換する

Compare:=vbTextCompare を使う

Replace関数の第6引数(compare)に"vbTextCompare"を指定すると、大文字・小文字、かな・カナ、全角・半角を区別せずに置換します。
文字「ABCabcABCabc」の「A」をブランクに置換すると「BCabcABCabc」となりますが、第六引数に"vbTextCompare"を指定すると「BCbcBCbc」となります。

旧Excelでは注意点あり

なお、サポートが切れているExcelを使用されている方は、vbTextCompare を指定しても「かな・カナ、全角・半角」が異なると置換しない可能性があります。 その場合は、StrConv関数を用いて「かな・カナ、全角・半角」を変換後、置換するようにしましょう。

Replace関数の第6引数(compare)の定数一覧

定数説明
vbUseCompareOption-1Option Compare ステートメントの設定を参照して、vbBinaryCompareか、vbTextCompare か を判断します。詳細は後述しますが、非推奨です。
vbBinaryCompare0規定値。大文字・小文字、かな・カナ、全角・半角を区別して文字を置換します。
vbTextCompare1大文字・小文字、かな・カナ、全角・半角を区別せずに文字を置換します。
vbDatabaseCompare2Microsoft Access のみ。 データベース内の情報に基づいて比較を実行します。

一部、Microsoft社のリファレンス【Replace関数の設定】を参照しています。
【Microsoft公式】Replace 関数の設定

サンプルコード

Sub SampleReplace3_1()
    Dim repBefore(1) As String
    Dim repAfterText(1) As String
    Dim repAfterBinary(1) As String
     
    repBefore(0) = "ABC_abc_ABC_abc"
    repAfterText(0) = Replace(repBefore(0), "A", "", _
                            Compare:=vbTextCompare)
    repAfterBinary(0) = Replace(repBefore(0), "A", "", _
                            Compare:=vbBinaryCompare)
    repBefore(1) = "あいう_アイウ_アイウ"
    repAfterText(1) = Replace(repBefore(1), "あ", "", _
                            Compare:=vbTextCompare)
    repAfterBinary(1) = Replace(repBefore(1), "あ", "", _
                            Compare:=vbBinaryCompare)

    Debug.Print "-- 「A」 を ブランク に置換  --"
    Debug.Print "≪置換前≫ " & repBefore(0)
    Debug.Print "vbTextCompare   で変換:" & repAfterText(0)
    Debug.Print "vbBinaryCompare で変換:" & repAfterBinary(0)
    Debug.Print ""
    Debug.Print "-- 「あ」 を ブランク に置換  --"
    Debug.Print "≪置換前≫ " & repBefore(1)
    Debug.Print "vbTextCompare   で変換:" & repAfterText(1)
    Debug.Print "vbBinaryCompare で変換:" & repAfterBinary(1)
End Sub

出力結果

-- 「A」 を ブランク に置換 --
≪置換前≫ ABC_abc_ABC_abc
vbTextCompare    で変換:BC_bc_BC_bc
vbBinaryCompare で変換:BC_abc_ABC_abc

-- 「あ」 を ブランク に置換 --
≪置換前≫    あいう_アイウ_アイウ
vbTextCompare    で変換:いう_イウ_イウ
vbBinaryCompare で変換:いう_アイウ_アイウ

※第六引数(compare)を省略した時、vbBinaryCompare となります。

3-2.特定の文字が何文字あるか識別する

Replace関数で何文字あるか調べたい文字を削除し、元の文字列の文字数から削除後の文字列の文字数を引くと調べられます。
文字列「ABCA」の中の「A」の個数を調べる場合、「ABCA」は4文字、「A」を削除後の「BC」は2文字なので、4-2→2個となります。 削除は、検索する文字をブランクにします。文字の削除については「2-1.郵便番号や、電話番号の「-」を削除する」を参照して下さい。

文字列の文字数を調べるには、Len関数を使用します。Len関数の引数に、調べたい文字列を送ると、文字数が返ります。

サンプルコード

Sub SampleReplace3_2()
    Dim fullPath As String
    Dim repBefore As String
    Dim repAfter As String
    Dim repChar As String   '個数を調べたい文字を代入する
    Dim num As Long
    
    repChar = "a"    '「a」の個数を調べる
    repBefore = "abc_abcd_abcde"
    repAfter = Replace(repBefore, repChar, "")
    
    num = Len(repBefore) - Len(repAfter)
    
    Debug.Print repChar & "は、" & num & "個あります"
End Sub

出力結果

aは、3個あります

3-3.検索対象の文字がないと、そのまま返す

Replace関数は、検索した文字が元の文字列に存在しない場合、元の文字列をそのまま返します。
文字列「ABCA」内の「Z」を「A」に置換する場合、Zは存在しないため、そのまま「ABCA」を返します。

サンプルコード

Sub SampleReplace3_3()
    Dim repBefore As String
    Dim repAfter As String
    
    '「\」のみにする(文字「/」は置換前に無い)
    repBefore = "C:\Users\Yamada\Desktop\hoge.txt"
    repAfter = Replace(repBefore, "/", "\")
    
    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:C:¥Users¥Yamada¥Desktop¥hoge.txt
置換後:C:¥Users¥Yamada¥Desktop¥hoge.txt

※ 置換前と置換後で変わりません

3-4.ファイルが何階層目にあるか識別する

これまでの応用技となります。
ファイルが何階層目にあるかは、ディレクトリの区切り文字が何文字あるかで調べることが出来ます。 「C:¥Users¥hoge.txt」なら、¥が2つあるため、第2階層です。

始めに、ディレクトリの区切りは「/」と「¥」の2つがあるため、統一します。
1-3.「/」を「¥」に統一する」を参照して、ディレクトリの区切りを「¥」だけにします。

次に「3-2.特定の文字が何文字あるか識別する」で、ディレクトリの区切り文字「¥」が何個あるかを調べます。 このディレクトリの区切り文字の個数が階層となります。

サンプルコード

Sub SampleReplace3_4()
    Dim repBefore As String
    Dim repAfter As String
    Dim num As Long
    
    repBefore = "C:\Users\Yamada\Desktop\hoge.txt"
    '/ を ¥ で統一する
    repAfter = Replace(repBefore, "/", "\")
    '¥ を 削除する
    repAfter = Replace(repBefore, "\", "")
    '\ の文字数をカウントする
    num = Len(repBefore) - Len(repAfter)
    
    Debug.Print num & "階層目にファイルがあります"
End Sub

出力結果

4階層目にファイルがあります

デフォルトで、異なる文字種を置換・削除する

Replace関数は、通常、文字種(大文字・小文字、かな・カナ、全角・半角)を区別して置換しますが、Option Compare ステートメントを指定すると、第6引数を指定せずに、異なる文字種の置換を行います。
なお、デフォルトで異なる文字種を置換すると設定したモジュール内で、異なる文字種の置換を行わない処理をする場合は、第6引数に「vbBinaryCompare」を指定する必要があります。
「Replace関数は、第6引数を指定しない限り、異なる文字種を置換しない」という本来の動作と違う設定に書き換えるため、他者から混乱を招く場合があります。これを読まれている方に使用をおススメしませんが、他者が作ったプログラムを読むときのために覚えておく必要はあるでしょう。

Option Compare で設定を変更する(Replace関数に明示無し)

異なる文字種を区別せずに置換する場合の、Option Compare ステートメントの指定方法は、モジュールの先頭で「Option Compare Text」と記載します。 変数の宣言を強制させる場合の「Option Explicit」と同様と言えば伝わりやすいでしょうか。

サンプルコード

Option Compare Text
Option Explicit   '←変数の宣言を強制する。無くても動く。

Sub SampleReplaceOCT1()
    Dim repBefore As String
    Dim repAfter As String
     
    repBefore = "ABC_abc"
    repAfter = Replace(repBefore, "A", "")

    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:ABC_abc
置換後:BC_bc

Option Compare で設定を変更する(Replace関数に明示あり)

Option Compare ステートメントで、異なる文字種の置換をするか設定できますが、モジュールの先頭に記載するため、テスト時に見落としがちです。 そこで、第6引数(compare)を「vbUseCompareOption」とすると『Option Compare ステートメントで定められた方法で置換します』と明記できますが、大きな弱点があります。 それは変数の宣言を強制させる「Option Explicit」を使用できなくなることです。「vbUseCompareOption」は定数として定義されていないため、「定義されていない変数」の扱いとなり、エラーが発生します。
なお「vbUseCompareOption」は定数でないため、候補一覧に表示されません。
compare の予測変換

サンプルコード

Option Compare Text
'Option Explicit   '←有効になっているとエラー

Sub SampleReplaceOCT2()
    Dim repBefore As String
    Dim repAfter As String
     
    repBefore = "ABC_abc"
    repAfter = Replace(repBefore, "A", "", _
                 compare:=vbUseCompareOption)

    Debug.Print "置換前:" & repBefore
    Debug.Print "置換後:" & repAfter
End Sub

出力結果

置換前:ABC_abc
置換後:BC_bc

引数がNullの場合

置換前の文字列(第一引数)がNullの場合はNullを返します。
Variant型以外は、Nullを格納できず「実行時エラー94」が発生します。
実行時エラーが発生すると、通常、プログラムの動作途中にプログラムが止まってしまいます。 これを回避するには「If文で置換前の文字列がNullでないかを確認し、エラー自体を発生させない方法」か、「エラートラップを用いてエラーが発生してもプログラムを止めずに特別処理を行う方法」で対応する必要があります。

If文で置換前の文字列が「Null」でないか確認する

If文で置換前の文字列が「Null」でないか確認します。
「IsNull(変数)」とすると変数がNullの場合、真となります。 Nullかのチェック自体はこれで良いですが、プログラムの読みやすさを考慮すると『Nullでない時に通常の処理』を行なうと良いでしょう。これには、真偽を反転させる「Not」を併用し、『If Not IsNull(変数) Then』とします。

サンプルコード

Sub SampleReplaceNull1()
    Dim val As Variant
    val = Null
    
    If Not IsNull(val) Then
        'Nullでなかったときの処理
        Debug.Print Replace(val, "/", "\")
    Else
        'Nullだったときの処理(Replace関数は使用しない)
        Debug.Print "valがNullです"
    End If
End Sub

出力結果

valがNullです

エラートラップで処理を行う

エラートラップを行い、エラーが発生してもプログラムを止めずに特別処理を行い処理をします。 エラートラップについての詳細は「【例外処理】エラーキャッチの方法」を参照してください。

サンプルコード

Sub SampleReplaceNull2()
    On Error GoTo ErrTrap
    Dim val As Variant
    val = Null
    val = Replace(val, "/", "\")  '←実行するとエラー
    Debug.Print val
    
    Exit Sub
    
ErrTrap:
    'エラー時の処理
    Debug.Print "エラー番号:" & Err.Number & _
                vbNewLine & Err.Description
End Sub

出力結果

エラー番号:94
Null の使い方が不正です。

関連リンク

ページの先頭へ