Excel VBAで文字列を扱う業務は非常に多く、
- データの表記ゆれを統一したい
- 不要な文字や記号だけを削除したい
- 特定の条件に合う文字列だけを置換したい
といった場面は、ほぼ毎日のように発生します。
多くの場合、
Replace 関数を使えば解決できそうに見えますが、
実務では次のような壁に必ずぶつかります。
- 「○○で始まる文字列だけ置換したい」
- 「数字だけを抽出・置換したい」
- 「桁数が不定のIDをまとめて変換したい」
- 「条件が複雑すぎてReplaceでは無理」
このときに真価を発揮するのが、
正規表現(Regular Expression) を使った文字列置換です。
この記事では、
Excel VBAにおける 正規表現を使った文字列置換 について、
- Replace関数との違い
- 正規表現の基本構造
- VBAでの具体的な書き方
- 実務でよく使う置換パターン
- 失敗しやすいポイントと対策
を、コード例中心・実務視点 で徹底解説します。
目次
- ✅ VBAで文字列置換に正規表現が必要になる理由
- ・Replace関数の限界
- ・正規表現は「条件付き置換」ができる
- ✅ VBAで正規表現を使うための準備
- ・VBAには正規表現専用のオブジェクトがある
- ・参照設定は必須?
- ・基本的な宣言方法
- ✅ 正規表現による置換の基本構文
- ・最も基本的な置換例
- ・重要なプロパティ3つ
- ✅ 正規表現の基本パターン(最低限ここだけ)
- ・よく使うメタ文字
- ・例:数字だけを置換する
- ✅ 数字だけを削除・置換する
- ・数字をすべて削除
- ・数字を特定文字に置換
- ✅ 英字・数字をまとめて置換する
- ・英数字をすべて削除
- ✅ 特定の形式の文字列だけ置換する
- ・電話番号形式だけを置換
- ✅ 行頭・行末を条件にした置換
- ・行頭の文字だけ削除
- ・行末の特定文字を削除
- ✅ 連続する空白・記号をまとめて置換
- ・連続スペースを1つにする
- ・連続記号を1つにまとめる
- ✅ 正規表現 × セル値の置換
- ・セルの値を正規表現で置換
- ・複数行をループで処理する
- ✅ 正規表現置換でよくある失敗と対策
- ・GlobalをTrueにしていない
- ・Patternを書き換え忘れる
- ・全角文字にマッチしない
- ✅ Replace関数と正規表現の使い分け
- ・Replaceが向いているケース
- ・正規表現が向いているケース
- ✅ 実務での設計ポイント
- ・正規表現は関数化する
- ✅ RPA(UiPath)連携時の注意点
- ✅ よくある勘違い
- ・正規表現は難しい
- ・全部正規表現にすべき
- ✅ まとめ:VBAの文字列置換は正規表現で一気に楽になる
✅ VBAで文字列置換に正規表現が必要になる理由
※Replace関数だけで済ませると、必ず限界が来ます。
・Replace関数の限界
VBA標準の Replace 関数は非常に便利ですが、
できることは次のように限られます。
- 完全一致の文字列置換
- 単純な文字列 → 文字列 の変換
result = Replace("ABC-123", "-", "")
これは問題ありません。
しかし、
- 数字だけを削除
- 特定の形式の文字列だけを置換
- 条件付きで一部だけ変更
といった処理は、
Replaceでは対応できません。
・正規表現は「条件付き置換」ができる
正規表現を使うと、
- 「数字だけ」
- 「英字だけ」
- 「〇文字以上」
- 「特定の並び」
といった パターン指定 が可能になります。
これにより、
Replaceでは不可能だった置換が一気に可能になります。
✅ VBAで正規表現を使うための準備
※ここを知らないと、最初でつまずきます。
・VBAには正規表現専用のオブジェクトがある
Excel VBAでは、
RegExp オブジェクト を使って正規表現を扱います。
これはVBA標準の構文ではなく、
外部ライブラリ(VBScript正規表現) に含まれています。
・参照設定は必須?
実は、RegExpは
- 参照設定を入れる方法
- CreateObjectで生成する方法
の2通りがあります。
実務では、
参照設定不要の CreateObject を使う方法 が安全です。
・基本的な宣言方法
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
これで、
正規表現を使う準備は完了です。
✅ 正規表現による置換の基本構文
※まずは最小構成を理解します。
・最も基本的な置換例
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "ABC"
reg.Global = True
result = reg.Replace("ABC-ABC-123", "XYZ")
実行結果:
XYZ-XYZ-123
・重要なプロパティ3つ
正規表現を使う際、最低限覚えるべきプロパティは次の3つです。
Pattern:検索パターンGlobal:全体置換するかどうかIgnoreCase:大文字小文字を区別するか
reg.Global = True
reg.IgnoreCase = True
✅ 正規表現の基本パターン(最低限ここだけ)
※すべて覚える必要はありません。
・よく使うメタ文字
| パターン | 意味 |
|---|---|
. | 任意の1文字 |
\d | 数字 |
\D | 数字以外 |
\w | 英数字 |
\s | 空白 |
+ | 1回以上 |
* | 0回以上 |
{n} | n回 |
{n,} | n回以上 |
・例:数字だけを置換する
reg.Pattern = "\d"
result = reg.Replace("A1B2C3", "")
結果:
ABC
✅ 数字だけを削除・置換する
※ID・コード整形で頻出です。
・数字をすべて削除
reg.Pattern = "\d+"
result = reg.Replace("商品123番号456", "")
結果:
商品番号
・数字を特定文字に置換
reg.Pattern = "\d+"
result = reg.Replace("ID12345", "【番号】")
✅ 英字・数字をまとめて置換する
※表記ゆれ対策でよく使います。
・英数字をすべて削除
reg.Pattern = "[A-Za-z0-9]+"
result = reg.Replace("ABC123_日本語", "")
結果:
_日本語
✅ 特定の形式の文字列だけ置換する
※Replaceでは不可能な代表例です。
・電話番号形式だけを置換
reg.Pattern = "\d{2,4}-\d{2,4}-\d{3,4}"
result = reg.Replace("TEL:03-1234-5678", "TEL:【非表示】")
✅ 行頭・行末を条件にした置換
※データ整形で非常に強力です。
・行頭の文字だけ削除
reg.Pattern = "^#"
result = reg.Replace("#コメント", "")
・行末の特定文字を削除
reg.Pattern = "円$"
result = reg.Replace("1000円", "")
✅ 連続する空白・記号をまとめて置換
※表記統一でよく使います。
・連続スペースを1つにする
reg.Pattern = "\s+"
result = reg.Replace("A B C", " ")
・連続記号を1つにまとめる
reg.Pattern = "-+"
result = reg.Replace("A---B--C", "-")
✅ 正規表現 × セル値の置換
※Excel実務では必須です。
・セルの値を正規表現で置換
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "\d+"
reg.Global = True
Cells(1, 1).Value = reg.Replace(Cells(1, 1).Value, "")
・複数行をループで処理する
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = reg.Replace(Cells(i, 1).Value, "")
Next i
✅ 正規表現置換でよくある失敗と対策
※ここを知らないとハマります。
・GlobalをTrueにしていない
reg.Global = False
この場合、
最初の1箇所しか置換されません。
・Patternを書き換え忘れる
同じ RegExp オブジェクトを使い回す場合、
Patternは毎回明示的に設定しましょう。
・全角文字にマッチしない
VBScriptの正規表現は、
- 全角数字
- 全角英字
には基本的にマッチしません。
全角対応が必要な場合は、
事前に全角→半角変換を行う設計が必要です。
✅ Replace関数と正規表現の使い分け
※どちらも使える人が実務では強いです。
・Replaceが向いているケース
- 完全一致
- 単純な置換
- 高速処理が必要
参考:【VBA】Replaceメソッドでワイルドカードを使う方法|正規表現で柔軟な一括置換を実現
・正規表現が向いているケース
- 条件付き置換
- パターン指定
- データクレンジング
参考:【VBA】Replaceメソッドでワイルドカードを使う方法|正規表現で柔軟な一括置換を実現
✅ 実務での設計ポイント
※使えるだけでなく「壊れない」ために。
・正規表現は関数化する
Function RegexReplace(text As String, pattern As String, rep As String) As String
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = pattern
reg.Global = True
RegexReplace = reg.Replace(text, rep)
End Function
これにより、
可読性と再利用性が大きく向上します。
✅ RPA(UiPath)連携時の注意点
※正規表現は自動化と相性が良いです。
- 表記ゆれの吸収
- 不要文字の除去
- データ整形の自動化
VBA側で正規表現を使って整形しておくことで、
RPAの処理は大幅に安定します。
✅ よくある勘違い
※遠回りする原因です。
・正規表現は難しい
→ 実務で使うのはごく一部です。
・全部正規表現にすべき
→ Replaceで済むならReplaceの方が良いです。
✅ まとめ:VBAの文字列置換は正規表現で一気に楽になる
- Replaceには限界がある
- 正規表現は「条件付き置換」ができる
- RegExpオブジェクトを使う
- よく使うパターンは限られている
- 実務ではReplaceとの使い分けが重要
正規表現を使えるようになると、
VBAの文字列処理は
「力技」から「設計」へ 変わります。
ぜひ、
日々のデータ整形・自動化業務に、
正規表現による文字列置換 を取り入れてみてください。