Excelで大量の文字データを扱っていると、「似たような文字列をまとめて置き換えたい」「一部の文字が異なるだけのパターンを一括処理したい」と感じたことはありませんか?
たとえば──
- 「A001」「A002」「A003」などをすべて「商品A」に統一したい
- 「No.」「番号」「ID」など似た意味の文字列をまとめて変換したい
- 文字列の中に含まれる数値や特定の記号を削除したい
こうしたときに多くの方が思いつくのが「ワイルドカードを使った置換」です。
しかし、VBAのReplaceメソッドは、Excelの検索・置換機能のようにワイルドカードを直接扱うことができません。
では、どうすればVBAでワイルドカードのような柔軟な置換を実現できるのか?
本記事では、Replaceメソッドと正規表現を組み合わせる方法を中心に、実務レベルで使えるコード例を詳しく解説します。
目次
- ✅ Replaceメソッドの基本構文とワイルドカードの限界
- ・基本構文
- ✅ Excelの「検索と置換」とVBA Replaceの違い
- ✅ 正規表現でワイルドカードを再現する方法
- ・基本構文
- ・基本例:数字を●に置き換える
- ✅ よく使う正規表現パターン一覧(ワイルドカード代替)
- ✅ 具体例①:商品コードをワイルドカード的に置換
- ✅ 具体例②:複数パターンを一括置換(Dictionary+RegExp)
- ✅ 具体例③:セル範囲内をまとめてワイルドカード置換
- ✅ 正規表現とReplaceメソッドの組み合わせパターン
- ✅ パフォーマンスを上げるコツ
- ✅ よくあるトラブルと対処法
- ✅ 応用:CSVデータを正規表現で整形する
- ✅ まとめ:VBAでもワイルドカード的な置換は可能!
✅ 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●」
このように、正規表現を使えばワイルドカードではできない「パターン指定の置換」が可能になります。
✅ よく使う正規表現パターン一覧(ワイルドカード代替)
| 正規表現 | 意味 | 例 |
|---|---|---|
. | 任意の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」のように自動で整形できます。
日付・コード・数値などを削除する際にも有効です。
✅ 正規表現とReplaceメソッドの組み合わせパターン
| 処理内容 | 使用方法 | 備考 |
|---|---|---|
| ワイルドカード置換 | RegExp.Replace | Patternを使って柔軟な条件設定 |
| 完全一致置換 | Replaceメソッド | 速度が速い |
| 複数条件置換 | Dictionary+Replace or RegExp | 一括処理に最適 |
| 高度なデータ整形 | RegExp.Replace | 数値・英字・記号パターンに対応 |
✅ パフォーマンスを上げるコツ
正規表現を使うと便利ですが、処理が遅くなることもあります。
以下の設定を意識するとスムーズに動作します。
- ScreenUpdatingをFalseにする
Application.ScreenUpdating = False - 正規表現オブジェクトを使い回す
Static reg As Object If reg Is Nothing Then Set reg = CreateObject("VBScript.RegExp") End If - 対象範囲を限定する
処理対象の範囲(例: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の文字列処理は一気に強力になります。
一度マスターすれば、商品コードの整形、日付の修正、記号削除など、
これまで手作業で行っていた「パターン修正作業」を完全自動化できるようになります。