Excel VBAで文字列を扱う業務は、実務では想像以上に多く発生します。
ファイル名、ログデータ、エラーメッセージ、システム出力、CSVの1項目、Webから取得したテキストなど、「そのまま使えない文字列」を加工する場面は日常的です。
特に多いのが、
- 「【】で囲まれた部分だけを取り出したい」
- 「()の中身だけ欲しい」
- 「特定の記号に挟まれた文字列を抽出したい」
といった 「同じ文字列(区切り文字)の“間”にある文字を取得したい」 という要望です。
一見すると簡単そうですが、実務では次のような落とし穴があります。
- 区切り文字が複数回出てくる
- 文字列が存在しない場合がある
- 全角・半角が混在している
- 想定外の文字列でエラーになる
この記事では、VBAで「同じ文字列の間の文字」を安全かつ実務向けに取り出す方法を、
基礎 → 応用 → 例外対策 → 実務設計
の流れで徹底解説します。
最後まで読むことで、「とりあえず動くコード」ではなく、実務で壊れない文字列抽出ロジックを自分で組めるようになります。
目次
- ✅ 「同じ文字列の間の文字」を取り出すとはどういう処理か
- ・処理イメージの基本
- ・「同じ文字列」とは何を意味するのか
- ✅ VBAで文字列を取り出す基本的な考え方
- ・基本となる3ステップ
- ✅ InStr関数を使った最も基本的な方法
- ・InStr関数の役割
- ・基本構文
- ✅ 同じ文字列の間を取得する最小構成コード
- ・処理の流れ解説
- ✅ 同じ記号(例:")の間を取得する方法
- ・サンプル文字列
- ・コード例
- ・ポイント
- ✅ 実務で必須:文字列が存在しない場合の対策
- ・よくあるトラブル
- ✅ 存在チェックを含めた安全なコード例
- ・このチェックが重要な理由
- ✅ 同じ文字列が複数回出てくる場合の考え方
- ✅ 最初の1つだけを取得する場合
- ✅ すべて取得したい場合(ループ設計)
- ・実務での活用例
- ✅ 関数化して再利用できる設計にする
- ・汎用関数例
- ✅ セル内文字列を対象にする実務例
- ✅ Split関数との違いと使い分け
- ・Splitが向いているケース
- ・InStr + Midが向いているケース
- ✅ 正規表現との比較(使わない理由)
- ✅ 実務でよくあるNG例
- ・存在チェックをしていない
- ・区切り文字の長さを考慮していない
- ・同じInStrを何度も書いている
- ✅ 実務設計で意識すべきポイント
- ✅ 業務自動化とのつながり
- ✅ まとめ:同じ文字列の間を安全に取り出し、実務で使えるVBAにする
✅ 「同じ文字列の間の文字」を取り出すとはどういう処理か
この処理を正しく書くためには、まず 何をゴールにしているのか を明確にする必要があります。
ここを曖昧にしたままコードを書くと、応用が効かなくなります。
・処理イメージの基本
例えば、次のような文字列があるとします。
【商品A】売上データ
この場合に取り出したいのは、
商品A
つまり、
- 開始文字列:
【 - 終了文字列:
】 - その 間にある文字列
です。
・「同じ文字列」とは何を意味するのか
ここでいう「同じ文字列」とは、
- 開始と終了が同じ記号
- 例:「"」と「"」、「#」と「#」
というケースも含みます。
例:
"ABC123"
この場合は、" と " の間にある ABC123 を取得します。
✅ VBAで文字列を取り出す基本的な考え方
VBAでは、「文字列の間」を直接取得する関数は存在しません。
そのため、位置を取得して切り出す という考え方が基本になります。
・基本となる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
・実務での活用例
- ログの複数タグ抽出
- データの分解
- 解析処理
参考:【VBA】文字列検索を部分一致で行う方法|Find・InStr・ループを使った実務サンプル
✅ 関数化して再利用できる設計にする
実務では、同じ処理を何度も使います。
そのため、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初心者が修正できない
という理由で、業務VBAでは避けられることが多いです。
参考:【VBA】文字列の置換を正規表現で行う方法|Replaceでは対応できない実務パターン完全解説
✅ 実務でよくあるNG例
・存在チェックをしていない
・区切り文字の長さを考慮していない
・同じInStrを何度も書いている
これらは、後から必ず不具合になります。
参考:【Excel】CSVの区切り文字を変更・指定して読み込む方法|列ズレ・文字化けを防ぐ実務ガイド
✅ 実務設計で意識すべきポイント
- 想定外データを前提にする
- 必ず存在チェックを書く
- Function化して再利用する
- 処理の意図が分かる名前を付ける
✅ 業務自動化とのつながり
この処理ができるようになると、
- ファイル名解析
- ログ解析
- CSV・TXT加工
- RPA前処理
など、自動化の幅が一気に広がります。
✅ まとめ:同じ文字列の間を安全に取り出し、実務で使えるVBAにする
- InStrとMidが基本
- 同じ文字列の場合は検索開始位置をずらす
- 存在チェックは必須
- 複数回出現する場合はループ設計
- Function化で再利用性を高める
「特定の文字列の間を取り出す」という処理は、
VBA文字列操作の中核となる技術です。
今回の内容をベースにすれば、
「たまたま動くコード」ではなく、
実務で信頼されるVBA処理を自信を持って書けるようになります。