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

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

Excel VBAで文字列を扱う業務は、実務では想像以上に多く発生します。
ファイル名、ログデータ、エラーメッセージ、システム出力、CSVの1項目、Webから取得したテキストなど、「そのまま使えない文字列」を加工する場面は日常的です。

特に多いのが、

  • 「【】で囲まれた部分だけを取り出したい」
  • 「()の中身だけ欲しい」
  • 「特定の記号に挟まれた文字列を抽出したい」

といった 「同じ文字列(区切り文字)の“間”にある文字を取得したい」 という要望です。

一見すると簡単そうですが、実務では次のような落とし穴があります。

  • 区切り文字が複数回出てくる
  • 文字列が存在しない場合がある
  • 全角・半角が混在している
  • 想定外の文字列でエラーになる

この記事では、VBAで「同じ文字列の間の文字」を安全かつ実務向けに取り出す方法を、
基礎 → 応用 → 例外対策 → 実務設計
の流れで徹底解説します。

最後まで読むことで、「とりあえず動くコード」ではなく、実務で壊れない文字列抽出ロジックを自分で組めるようになります。

目次

✅ 「同じ文字列の間の文字」を取り出すとはどういう処理か

この処理を正しく書くためには、まず 何をゴールにしているのか を明確にする必要があります。
ここを曖昧にしたままコードを書くと、応用が効かなくなります。

・処理イメージの基本

例えば、次のような文字列があるとします。

【商品A】売上データ

この場合に取り出したいのは、

商品A

つまり、

  • 開始文字列:
  • 終了文字列:
  • その 間にある文字列

です。

・「同じ文字列」とは何を意味するのか

ここでいう「同じ文字列」とは、

  • 開始と終了が同じ記号
  • 例:「"」と「"」、「#」と「#」

というケースも含みます。

例:

"ABC123"

この場合は、"" の間にある ABC123 を取得します。


✅ VBAで文字列を取り出す基本的な考え方

VBAでは、「文字列の間」を直接取得する関数は存在しません。
そのため、位置を取得して切り出す という考え方が基本になります。

・基本となる3ステップ

  1. 開始文字列の位置を取得
  2. 終了文字列の位置を取得
  3. その間を切り出す

この考え方を理解することが、すべての応用の土台になります。


✅ InStr関数を使った最も基本的な方法

まずは、最も基本となる InStr 関数を使った方法から確認します。

・InStr関数の役割

InStr は、指定した文字列が何文字目にあるかを返します。

・基本構文

InStr(文字列, 検索文字)

✅ 同じ文字列の間を取得する最小構成コード

Sub GetBetweenText_Basic()

    Dim target As String
    Dim startPos As Long
    Dim endPos As Long
    Dim result As String

    target = "【商品A】売上データ"

    startPos = InStr(target, "【")
    endPos = InStr(target, "】")

    result = Mid(target, startPos + 1, endPos - startPos - 1)

    MsgBox result

End Sub

・処理の流れ解説

  • InStr で開始位置と終了位置を取得
  • Mid でその間を切り出す
  • +1-1 で記号自体を除外

この形が すべての基本形 になります。


 

✅ 同じ記号(例:")の間を取得する方法

開始と終了が同じ文字の場合は、少し注意が必要です。

・サンプル文字列

"ABC123"

・コード例

Sub GetBetweenSameChar()

    Dim target As String
    Dim startPos As Long
    Dim endPos As Long

    target = """ABC123"""

    startPos = InStr(target, """")
    endPos = InStr(startPos + 1, target, """")

    MsgBox Mid(target, startPos + 1, endPos - startPos - 1)

End Sub

・ポイント

  • 2回目の InStr開始位置をずらす
  • そうしないと同じ位置を取得してしまう

✅ 実務で必須:文字列が存在しない場合の対策

実務では、「必ず存在する前提」は非常に危険です。

・よくあるトラブル

  • 区切り文字が含まれていない
  • 開始はあるが終了がない
  • 空文字が返ってくる

✅ 存在チェックを含めた安全なコード例

Sub GetBetweenSafe()

    Dim target As String
    Dim startPos As Long
    Dim endPos As Long

    target = "商品A 売上データ"

    startPos = InStr(target, "【")
    endPos = InStr(target, "】")

    If startPos = 0 Or endPos = 0 Then
        MsgBox "対象の文字列が見つかりません"
        Exit Sub
    End If

    MsgBox Mid(target, startPos + 1, endPos - startPos - 1)

End Sub

・このチェックが重要な理由

  • 実行時エラーを防ぐ
  • 想定外データでも止まらない
  • 実務で安心して使える

✅ 同じ文字列が複数回出てくる場合の考え方

次のような文字列を考えます。

【A】【B】【C】

この場合、

  • 最初の間
  • すべての間
  • 特定の位置の間

どれを取りたいのかで設計が変わります。

参考:【VBA】検索してセル位置を取得する方法|Find・InStr・ループを徹底活用


✅ 最初の1つだけを取得する場合

startPos = InStr(target, "【")
endPos = InStr(startPos + 1, target, "】")

✅ すべて取得したい場合(ループ設計)

Sub GetAllBetween()

    Dim target As String
    Dim pos As Long
    Dim startPos As Long
    Dim endPos As Long

    target = "【A】【B】【C】"
    pos = 1

    Do
        startPos = InStr(pos, target, "【")
        endPos = InStr(pos, target, "】")

        If startPos = 0 Or endPos = 0 Then Exit Do

        Debug.Print Mid(target, startPos + 1, endPos - startPos - 1)
        pos = endPos + 1

    Loop

End Sub

・実務での活用例


 

✅ 関数化して再利用できる設計にする

実務では、同じ処理を何度も使います。
そのため、Function化が非常に重要です。

・汎用関数例

Function GetBetweenText(ByVal target As String, _
                        ByVal delimiter As String) As String

    Dim startPos As Long
    Dim endPos As Long

    startPos = InStr(target, delimiter)
    endPos = InStr(startPos + 1, target, delimiter)

    If startPos = 0 Or endPos = 0 Then
        GetBetweenText = ""
        Exit Function
    End If

    GetBetweenText = Mid(target, startPos + Len(delimiter), _
                         endPos - startPos - Len(delimiter))

End Function

✅ セル内文字列を対象にする実務例

Sub GetFromCell()

    Dim text As String
    text = Range("A1").Value

    Range("B1").Value = GetBetweenText(text, "【")

End Sub

✅ Split関数との違いと使い分け

「Splitでもできるのでは?」という疑問もよくあります。

・Splitが向いているケース

  • 区切りが1種類
  • 単純な分割

・InStr + Midが向いているケース

  • 前後関係を重視
  • 同じ文字列の間
  • 例外処理が必要

実務では、InStrベースの方が柔軟です。

参考:【VBA】Split関数:文字列を分割する方法


✅ 正規表現との比較(使わない理由)

正規表現でも同様の処理は可能ですが、

  • 可読性が低い
  • 保守性が下がる
  • VBA初心者が修正できない

という理由で、業務VBAでは避けられることが多いです。

参考:【VBA】文字列の置換を正規表現で行う方法|Replaceでは対応できない実務パターン完全解説


✅ 実務でよくあるNG例

・存在チェックをしていない

・区切り文字の長さを考慮していない

・同じInStrを何度も書いている

これらは、後から必ず不具合になります。

参考:【Excel】CSVの区切り文字を変更・指定して読み込む方法|列ズレ・文字化けを防ぐ実務ガイド


✅ 実務設計で意識すべきポイント

  • 想定外データを前提にする
  • 必ず存在チェックを書く
  • Function化して再利用する
  • 処理の意図が分かる名前を付ける

✅ 業務自動化とのつながり

この処理ができるようになると、

  • ファイル名解析
  • ログ解析
  • CSV・TXT加工
  • RPA前処理

など、自動化の幅が一気に広がります


 

✅ まとめ:同じ文字列の間を安全に取り出し、実務で使えるVBAにする

  • InStrとMidが基本
  • 同じ文字列の場合は検索開始位置をずらす
  • 存在チェックは必須
  • 複数回出現する場合はループ設計
  • Function化で再利用性を高める

「特定の文字列の間を取り出す」という処理は、
VBA文字列操作の中核となる技術です。

今回の内容をベースにすれば、
「たまたま動くコード」ではなく、
実務で信頼されるVBA処理を自信を持って書けるようになります。

参考:【VBA】Function で複数の戻り値を返す方法と活用例

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