VBAで自動化 VBA一覧 セル・値の取得と貼り付け 値の一部

【VBA】特定の(異なる)文字列の間の文字を取り出す方法を解説

Excel VBAで文字列を扱っていると、
「この文字とこの文字の“間”だけを取り出したい」
という要件は非常に頻繁に登場します。

たとえば、

  • 【】や()の中の文字だけを取得したい
  • URLの一部だけを抜き出したい
  • ログやCSVの特定区間を抽出したい
  • メール文面やファイル名から必要な情報だけを切り出したい

といったケースです。

一見すると単純そうに見えますが、
開始文字と終了文字が異なる
存在しない場合がある
複数回登場する
ネストしている
など、実務では一筋縄ではいきません。

この記事では、
VBAで「異なる文字列の間の文字」を安全・柔軟・再利用可能に取り出す方法を、
基礎から実務レベルまで段階的に解説します。

✅ 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

・コードの考え方

  1. 開始文字列の位置を取得
  2. 終了文字列の位置を取得
  3. 開始位置+開始文字列の長さ から
  4. 終了位置の直前までを切り出す

この順番が基本です。

参考:【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

・正規表現を使うメリット


✅ 実務でよくある応用パターン

ここからは、
実務で特に多い応用パターンを整理します。
これらを押さえておくと、
多くの案件でそのまま流用できます。

・ファイル名から管理番号を抽出

・メール件名から案件名を取得

・CSVの特定区間を切り出す

・ログ文字列からエラーコードを抽出


✅ RPA・自動処理を意識した関数設計の考え方

RPAやバッチ処理では、
「止まらない」「例外に強い」設計が重要です。
そのため、
単発マクロではなく、
関数化・共通化が必須になります。

  • 戻り値は空文字で統一
  • エラーを投げない
  • 呼び出し側で判定できる

この設計思想は、
後々大きな差になります。


✅ よくある失敗とその回避策

最後に、
この処理でよくある失敗を整理します。

  • 開始と終了の順序を考慮していない
  • 存在チェックをしていない
  • 複数出現パターンを想定していない
  • ベタ書きで再利用できない

これらはすべて、
今回紹介した設計で回避できます。


 

✅ まとめ:異なる文字列の間を安全に取り出すために

  • InStr+Midが基本構造
  • 存在チェックは必須
  • 複数出現時は基準を明確にする
  • 正規表現は複雑な条件で有効
  • 関数化して再利用性を高める

VBAでの文字列処理は、
一度しっかり設計しておくことで、
業務効率とコード品質が大きく向上します。

今回の内容をベースにすれば、
「異なる文字列の間を取り出す」処理で迷うことはなくなるはずです。

参考:【VBA】特定の(同じ)文字列の間の文字を取り出す|実務で使える完全設計ガイド

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