VBAで自動化 VBA一覧 セル・値の取得と貼り付け 置き換え

【VBA】Replaceメソッドでワイルドカードを使う方法|正規表現で柔軟な一括置換を実現

Excelで大量の文字データを扱っていると、「似たような文字列をまとめて置き換えたい」「一部の文字が異なるだけのパターンを一括処理したい」と感じたことはありませんか?
たとえば──

  • 「A001」「A002」「A003」などをすべて「商品A」に統一したい
  • 「No.」「番号」「ID」など似た意味の文字列をまとめて変換したい
  • 文字列の中に含まれる数値や特定の記号を削除したい

こうしたときに多くの方が思いつくのが「ワイルドカードを使った置換」です。
しかし、VBAのReplaceメソッドは、Excelの検索・置換機能のようにワイルドカードを直接扱うことができません。

では、どうすればVBAでワイルドカードのような柔軟な置換を実現できるのか?
本記事では、Replaceメソッドと正規表現を組み合わせる方法を中心に、実務レベルで使えるコード例を詳しく解説します。

✅ Replaceメソッドの基本構文とワイルドカードの限界

まず、Replaceメソッドの基本から確認しておきましょう。

・基本構文

Replace(文字列, 検索文字列, 置換後文字列, [開始位置], [置換回数], [比較方法])

例として、次のコードを見てみます。

Sub BasicReplace()
    Dim str As String
    str = "A001, A002, A003"
    str = Replace(str, "A00", "商品A")
    MsgBox str
End Sub

結果:
商品A1, 商品A2, 商品A3

このように部分一致で置き換えることは可能です。
しかし、「A」+任意の数字というようなパターンマッチはできません。
Replaceメソッドでは「*」「?」といったワイルドカードを理解しないためです。


✅ Excelの「検索と置換」とVBA Replaceの違い

ExcelのUIにある「検索と置換」では、次のようなワイルドカードが使用できます。

ワイルドカード意味
*任意の文字列A* → Aで始まるすべての文字
?任意の1文字A?3 → Aと3の間に1文字あるもの

一方、VBAのReplaceメソッドは単なる文字列操作であり、「A*」という文字列をそのまま探す処理しか行いません。
つまり、ワイルドカード置換を行いたい場合は別の方法が必要です。

その“別の方法”が「正規表現(RegExp)」です。

参考:【VBA】Replace関数でスペース(半角:全角)を削除する方法


✅ 正規表現でワイルドカードを再現する方法

VBAで正規表現を扱うには、「VBScript.RegExp」というオブジェクトを使用します。
これを使うと、*? よりもはるかに柔軟なパターン検索・置換が可能です。

・基本構文

Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")

With reg
    .Pattern = "検索パターン"
    .Global = True
End With

result = reg.Replace(対象文字列, 置換後文字列)

・基本例:数字を●に置き換える

Sub ReplaceNumbers()
    Dim reg As Object
    Dim result As String
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "[0-9]+"  '1桁以上の数字
        .Global = True
    End With
    
    result = reg.Replace("商品A001、商品A002、商品A003", "●")
    MsgBox result
End Sub

実行結果:
「商品A●、商品A●、商品A●」

このように、正規表現を使えばワイルドカードではできない「パターン指定の置換」が可能になります。

参考:【VBA】ワイルドカードの使用方法


✅ よく使う正規表現パターン一覧(ワイルドカード代替)

正規表現意味
.任意の1文字A.3 → Aと3の間の任意1文字
.*任意の文字列(0文字以上)A.*B → AとBの間の任意の文字列
[0-9]数字1文字[0-9]{3} → 数字3桁
[A-Za-z]英字1文字[A-Z]{2,4} → 英大文字2〜4桁
^行の先頭^A → Aで始まる行
$行の末尾A$ → Aで終わる行

Replaceメソッド単体ではできなかった柔軟な置換を、
これらのパターンを使えば自由自在に実現できます。


✅ 具体例①:商品コードをワイルドカード的に置換

たとえば、「A001」「A002」「A003」などをまとめて「商品A」に置き換えたい場合。

Sub ReplaceProductCode()
    Dim reg As Object
    Dim result As String
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "A[0-9]{3}"   'A+数字3桁
        .Global = True
    End With
    
    result = reg.Replace("A001, A002, A003", "商品A")
    MsgBox result
End Sub

結果:
「商品A, 商品A, 商品A」

このように「A[0-9]{3}」という正規表現が、ワイルドカードのような働きをします。


✅ 具体例②:複数パターンを一括置換(Dictionary+RegExp)

正規表現をDictionaryと組み合わせると、複数条件の一括置換が可能になります。

Sub MultiPatternReplace()
    Dim dict As Object
    Dim reg As Object
    Dim txt As String
    Dim key As Variant
    
    txt = "ID:123, TEL:03-1234-5678, ZIP:123-4567"
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "\d{3}-\d{4}", "〒●●●-●●●"   '郵便番号
    dict.Add "\d{2,4}-\d{2,4}-\d{3,4}", "電話番号"  '電話番号
    dict.Add "\d+", "番号"                  'その他数字
    
    For Each key In dict.keys
        Set reg = CreateObject("VBScript.RegExp")
        reg.Global = True
        reg.Pattern = key
        txt = reg.Replace(txt, dict(key))
    Next key
    
    MsgBox txt
End Sub

結果:
「ID:番号, TEL:電話番号, ZIP:〒●●●-●●●」

複数の正規表現を順に適用することで、実務レベルのデータクレンジングが可能になります。


✅ 具体例③:セル範囲内をまとめてワイルドカード置換

次の例では、A列のすべてのセルに対して「数字を削除」します。

Sub ReplaceInCells()
    Dim reg As Object
    Dim c As Range
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "[0-9]+"
        .Global = True
    End With
    
    For Each c In Range("A1:A100")
        If c.Value <> "" Then
            c.Value = reg.Replace(c.Value, "")
        End If
    Next c
End Sub

これで「商品A001」→「商品A」のように自動で整形できます。
日付・コード・数値などを削除する際にも有効です。

参考:【VBA】ファイルを開く:ワイルドカード




✅ 正規表現とReplaceメソッドの組み合わせパターン

処理内容使用方法備考
ワイルドカード置換RegExp.ReplacePatternを使って柔軟な条件設定
完全一致置換Replaceメソッド速度が速い
複数条件置換Dictionary+Replace or RegExp一括処理に最適
高度なデータ整形RegExp.Replace数値・英字・記号パターンに対応

✅ パフォーマンスを上げるコツ

正規表現を使うと便利ですが、処理が遅くなることもあります。
以下の設定を意識するとスムーズに動作します。

  1. ScreenUpdatingをFalseにする
    Application.ScreenUpdating = False
    
  2. 正規表現オブジェクトを使い回す
    Static reg As Object
    If reg Is Nothing Then
        Set reg = CreateObject("VBScript.RegExp")
    End If
    
  3. 対象範囲を限定する
    処理対象の範囲(例:UsedRangeやA1:A100)を明確にすることで無駄を減らせます。

✅ よくあるトラブルと対処法

症状原因対処法
Patternが無効エスケープ文字の不足\(\. のように特殊文字をエスケープ
一部のセルしか置換されない.GlobalがFalse.Global = Trueを設定する
文字化けが起きる全角・半角混在Replace前にStrConvで統一
処理が遅い範囲が広すぎる必要な範囲のみ対象にする

✅ 応用:CSVデータを正規表現で整形する

Replaceメソッド+正規表現は、CSVなどの文字ベースデータの整形にも有効です。

Sub CleanCsv()
    Dim reg As Object
    Dim txt As String
    Set reg = CreateObject("VBScript.RegExp")
    
    Open "C:\data.csv" For Input As #1
    txt = Input$(LOF(1), #1)
    Close #1
    
    With reg
        .Pattern = """|,"",|,,"  '余分なカンマやダブルクオート削除
        .Global = True
    End With
    txt = reg.Replace(txt, "")
    
    Open "C:\data_clean.csv" For Output As #2
    Print #2, txt
    Close #2
End Sub

ファイル内の不要文字をまとめて削除・変換でき、データクレンジング業務を自動化できます。


✅ まとめ:VBAでもワイルドカード的な置換は可能!

  • Replaceメソッド単体ではワイルドカード(*?)を認識しない
  • 柔軟な置換を行いたい場合は正規表現(RegExp)を利用する
  • Patternで自由に検索条件を設定し、Replaceで置換可能
  • 複数条件を扱う場合はDictionaryやループ構文と組み合わせる
  • .GlobalをTrueに設定して全件置換を行う
  • ScreenUpdatingを停止して高速化

正規表現を使えば、Excel VBAの文字列処理は一気に強力になります。
一度マスターすれば、商品コードの整形、日付の修正、記号削除など、
これまで手作業で行っていた「パターン修正作業」を完全自動化できるようになります。

    -VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 置き換え