Excel VBAで文字列を扱っていると、
「この文字とこの文字の“間”だけを取り出したい」
という要件は非常に頻繁に登場します。
たとえば、
- 【】や()の中の文字だけを取得したい
- URLの一部だけを抜き出したい
- ログやCSVの特定区間を抽出したい
- メール文面やファイル名から必要な情報だけを切り出したい
といったケースです。
一見すると単純そうに見えますが、
開始文字と終了文字が異なる、
存在しない場合がある、
複数回登場する、
ネストしている
など、実務では一筋縄ではいきません。
この記事では、
VBAで「異なる文字列の間の文字」を安全・柔軟・再利用可能に取り出す方法を、
基礎から実務レベルまで段階的に解説します。
目次
- ✅ VBAで「文字列の間」を取り出す処理が難しい理由
- ・開始文字と終了文字が異なる
- ・存在しないケースがある
- ✅ VBAで使える基本的な文字列操作関数
- ・InStr関数
- ・Mid関数
- ・Len関数
- ✅ 最も基本的な「異なる文字列の間」を取り出す方法
- ・基本コード例
- ・コードの考え方
- ✅ 開始・終了文字列が見つからない場合の安全対策
- ・存在チェックを入れたコード例
- ・このチェックが重要な理由
- ✅ 同じ文字列が複数回出現する場合の考え方
- ・最初のペアを対象にする
- ・最後のペアを対象にする
- ✅ InStrRevを使って最後の文字列を基準にする
- ・コード例
- ✅ 正規表現を使った柔軟な抽出方法
- ・正規表現を使った例
- ・正規表現を使うメリット
- ✅ 実務でよくある応用パターン
- ・ファイル名から管理番号を抽出
- ・メール件名から案件名を取得
- ・CSVの特定区間を切り出す
- ・ログ文字列からエラーコードを抽出
- ✅ RPA・自動処理を意識した関数設計の考え方
- ✅ よくある失敗とその回避策
- ✅ まとめ:異なる文字列の間を安全に取り出すために
✅ VBAで「文字列の間」を取り出す処理が難しい理由
VBAでの文字列抽出は、
単純な関数の組み合わせでは対応しきれない場面が多くあります。
特に「開始文字列」と「終了文字列」が異なる場合、
処理の考え方を誤るとすぐにエラーや誤抽出につながります。
ここを理解せずにコードを書くと、
一部のデータでは動くが、別データでは壊れるコードになります。
まずは、なぜこの処理が難しくなりがちなのかを整理します。
・開始文字と終了文字が異なる
「【 ~ 】」「< ~ >」「start ~ end」など、
開始と終了が同じ文字でない場合、
単純な分割処理では対応できません。
・存在しないケースがある
対象文字列が必ず存在するとは限らず、
存在しない場合の考慮が必須です。
✅ VBAで使える基本的な文字列操作関数
本題に入る前に、
この処理で頻繁に使うVBAの基本関数を整理しておきます。
ここを理解していないと、
後半のコード解説が一気に難しく感じます。
逆に言えば、
ここを押さえれば応用が効くようになります。
・InStr関数
指定した文字列が、
元の文字列の何文字目にあるかを取得します。
・Mid関数
指定した位置から、
指定した文字数分を取り出します。
・Len関数
文字列の長さを取得します。
✅ 最も基本的な「異なる文字列の間」を取り出す方法
まずは最もシンプルなケースから解説します。
「必ず開始文字列と終了文字列が1回ずつ存在する」
という前提の処理です。
この考え方が、すべての応用の土台になります。
実務では前提が崩れることも多いですが、
まずはここを確実に理解してください。
・基本コード例
Sub ExtractBetweenStrings_Basic()
Dim src As String
Dim startStr As String
Dim endStr As String
Dim startPos As Long
Dim endPos As Long
Dim result As String
src = "商品【ABC123】の在庫"
startStr = "【"
endStr = "】"
startPos = InStr(src, startStr)
endPos = InStr(src, endStr)
result = Mid(src, _
startPos + Len(startStr), _
endPos - (startPos + Len(startStr)))
MsgBox result
End Sub
・コードの考え方
- 開始文字列の位置を取得
- 終了文字列の位置を取得
- 開始位置+開始文字列の長さ から
- 終了位置の直前までを切り出す
この順番が基本です。
参考:【VBA】文字列操作関数【Mid・Left・Right】|実務で使い倒す完全ガイド
✅ 開始・終了文字列が見つからない場合の安全対策
実務では、
必ずしも対象文字列が存在するとは限りません。
このチェックを怠ると、
実行時エラーや誤った抽出結果につながります。
この章では、安全に処理するための必須対策を解説します。
・存在チェックを入れたコード例
Function ExtractBetweenStrings_Safe(src As String, _
startStr As String, _
endStr As String) As String
Dim startPos As Long
Dim endPos As Long
startPos = InStr(src, startStr)
endPos = InStr(src, endStr)
If startPos = 0 Or endPos = 0 Then
ExtractBetweenStrings_Safe = ""
Exit Function
End If
ExtractBetweenStrings_Safe = _
Mid(src, startPos + Len(startStr), _
endPos - (startPos + Len(startStr)))
End Function
・このチェックが重要な理由
- データ欠損に強くなる
- RPAや自動処理で止まりにくい
- 後工程の判定が楽になる
✅ 同じ文字列が複数回出現する場合の考え方
「【】が複数ある文字列」
というケースは非常に多いです。
この場合、
どのペアを対象にするかを明確にしなければなりません。
ここを曖昧にすると、
想定外の文字列を抽出します。
この章では、考え方の整理を行います。
・最初のペアを対象にする
InStrをそのまま使うと、
最初に見つかった位置が対象になります。
・最後のペアを対象にする
InStrRevを使うことで、
後ろから検索できます。
参考:【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法|InStrRev含めた解説
✅ InStrRevを使って最後の文字列を基準にする
後ろ側の文字列を基準にしたい場合、
InStrRevが非常に有効です。
ログ解析やURL処理などで頻出します。
・コード例
Function ExtractBetween_Last(src As String, _
startStr As String, _
endStr As String) As String
Dim startPos As Long
Dim endPos As Long
endPos = InStrRev(src, endStr)
startPos = InStrRev(src, startStr, endPos)
If startPos = 0 Or endPos = 0 Then
ExtractBetween_Last = ""
Exit Function
End If
ExtractBetween_Last = _
Mid(src, startPos + Len(startStr), _
endPos - (startPos + Len(startStr)))
End Function
✅ 正規表現を使った柔軟な抽出方法
条件が複雑になる場合、
正規表現を使う方が可読性・保守性ともに向上します。
特に、
- パターンが可変
- ネストがある
- 書式が不統一
といった場合に有効です。
・正規表現を使った例
Function ExtractBetweenRegex(src As String) As String
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "【(.*?)】"
reg.Global = False
If reg.Test(src) Then
ExtractBetweenRegex = reg.Execute(src)(0).SubMatches(0)
Else
ExtractBetweenRegex = ""
End If
End Function
・正規表現を使うメリット
- コードが短くなる
- 条件変更に強い
- 複雑なケースに対応しやすい
参考:【VBA】文字列の置換を正規表現で行う方法|Replaceでは対応できない実務パターン完全解説
✅ 実務でよくある応用パターン
ここからは、
実務で特に多い応用パターンを整理します。
これらを押さえておくと、
多くの案件でそのまま流用できます。
・ファイル名から管理番号を抽出
・メール件名から案件名を取得
・CSVの特定区間を切り出す
・ログ文字列からエラーコードを抽出
✅ RPA・自動処理を意識した関数設計の考え方
RPAやバッチ処理では、
「止まらない」「例外に強い」設計が重要です。
そのため、
単発マクロではなく、
関数化・共通化が必須になります。
- 戻り値は空文字で統一
- エラーを投げない
- 呼び出し側で判定できる
この設計思想は、
後々大きな差になります。
✅ よくある失敗とその回避策
最後に、
この処理でよくある失敗を整理します。
- 開始と終了の順序を考慮していない
- 存在チェックをしていない
- 複数出現パターンを想定していない
- ベタ書きで再利用できない
これらはすべて、
今回紹介した設計で回避できます。
✅ まとめ:異なる文字列の間を安全に取り出すために
- InStr+Midが基本構造
- 存在チェックは必須
- 複数出現時は基準を明確にする
- 正規表現は複雑な条件で有効
- 関数化して再利用性を高める
VBAでの文字列処理は、
一度しっかり設計しておくことで、
業務効率とコード品質が大きく向上します。
今回の内容をベースにすれば、
「異なる文字列の間を取り出す」処理で迷うことはなくなるはずです。