Excel VBAで文字列を扱っていると、「特定の文字がどこにあるか」を調べたい場面は非常に多くあります。
ファイル名、パス、CSVデータ、ログ、ユーザー入力文字列など、実務で扱うデータはほぼ例外なく文字列を含んでいます。
その中でも特に多いのが、次のような要望です。
- ファイルパスの最後の「\」の位置を知りたい
- 拡張子の直前の「.」を後ろから探したい
- 「最後に出てくる区切り文字」を基準に分割したい
- 同じ文字が複数ある中で一番うしろの位置を取得したい
こうした処理を 前から探す InStr だけで書こうとして失敗する ケースは、実務では非常に多く見られます。
この記事では、
- InStr関数の基本
- 「うしろから検索したい」ときの正しい考え方
- InStrを使った後方検索の工夫
- InStrRev関数の正しい使い方
- 実務で壊れない設計パターン
までを、考え方重視・実務目線で徹底解説します。
最後まで読むことで、「なぜ後ろから検索する必要があるのか」「どの関数を使えばよいのか」「実務ではどう書くのが正解か」が明確になり、文字列操作で迷わなくなるVBA設計力が身につきます。
目次
- ✅ なぜ「うしろから文字を検索したい」のか
- ・同じ文字が複数含まれているケース
- ・前から検索すると起きる問題
- ✅ InStr関数の基本をおさらいする
- ・InStr関数の基本構文
- ・戻り値の意味
- ✅ InStrは「前から検索する関数」である
- ・開始位置を指定しても「後ろ検索」にはならない
- ✅ InStrで「うしろから検索したい」ときの考え方
- ✅ InStrを使って最後の位置を取得する方法(ループ)
- ・この処理の考え方
- ・メリットとデメリット
- ✅ InStrRev関数を使うのが正解
- ✅ InStrRev関数とは何か
- ・InStrRev関数の基本構文
- ・戻り値
- ✅ InStrRevの基本的な使用例
- ✅ InStrRevが実務でよく使われる代表例
- ・ファイルパスからファイル名を取得する
- ・拡張子を取得する
- ✅ InStrRevとMidを組み合わせた王道パターン
- ✅ 見つからない場合を必ず考慮する
- ・存在チェックを入れた安全な例
- ✅ InStrRevでも「同じ文字が複数ある」問題は解決できる
- ✅ InStrとInStrRevの使い分け基準
- ・InStrを使うべきケース
- ・InStrRevを使うべきケース
- ✅ InStrRevは「万能」ではない
- ・向いていないケース
- ✅ InStrRevをFunction化して再利用する
- ✅ セルの値を対象にした実務例
- ✅ 実務でよくあるNGパターン
- ・InStrで無理やり後ろ検索しようとしている
- ・InStrRevの戻り値0を考慮していない
- ・可読性の低いネスト構造
- ✅ 業務自動化での活用シーン
- ✅ まとめ:InStrRevを理解し、うしろから検索できるVBAを書く
✅ なぜ「うしろから文字を検索したい」のか
InStr関数は非常に有名ですが、
「前から検索する」ことしかできないと思い込んでいる人が少なくありません。
しかし実務では、後ろから探さないと正しく処理できないケースが多数存在します。
まずは、その理由を整理しましょう。
・同じ文字が複数含まれているケース
例えば、次のような文字列を考えます。
C:\Users\Sample\Documents\report.xlsx
この文字列には「\」が複数含まれています。
ここで知りたいのは、
- 最初の「\」 → ほぼ意味がない
- 最後の「\」 → ファイル名を切り出す基準
というケースがほとんどです。
・前から検索すると起きる問題
InStr(path, "\")
この結果は、最初の「\」の位置です。
実務で欲しい「最後の位置」ではありません。
✅ InStr関数の基本をおさらいする
後方検索を理解する前に、まずはInStr関数の基本を整理します。
ここが曖昧だと、後ろから検索するロジックも理解できません。
・InStr関数の基本構文
InStr(文字列, 検索文字)
または
InStr(開始位置, 文字列, 検索文字)
・戻り値の意味
- 見つかった場合 → 文字の位置(1開始)
- 見つからない場合 → 0
この「0が返る」という仕様は、
後方検索を行う際にも非常に重要です。
✅ InStrは「前から検索する関数」である
InStr関数の最大の特徴は、
必ず前(左)から検索する という点です。
・開始位置を指定しても「後ろ検索」にはならない
InStr(Len(text), text, "\")
一見すると「後ろから検索していそう」に見えますが、
実際には 指定した位置から前方向に検索することはできません。
InStrはあくまで、
開始位置 → 右方向に検索
という動作しかしません。
✅ InStrで「うしろから検索したい」ときの考え方
では、InStrしか使えない場合、どうすればよいのでしょうか。
答えはシンプルで、
「最後に見つかった位置」を覚える
という方法です。
✅ InStrを使って最後の位置を取得する方法(ループ)
Sub GetLastPosition_ByLoop()
Dim text As String
Dim pos As Long
Dim lastPos As Long
text = "A-B-C-D"
pos = InStr(text, "-")
Do While pos > 0
lastPos = pos
pos = InStr(pos + 1, text, "-")
Loop
MsgBox lastPos
End Sub
・この処理の考え方
- InStrで見つかるたびに位置を更新
- 最後に見つかった位置が「一番うしろ」
- 見つからなくなったら終了
・メリットとデメリット
メリット
- InStrだけで完結
- VBA初心者にも理解しやすい
デメリット
- 処理が長い
- 可読性がやや低い
参考:【VBA】検索してセル位置を取得する方法|Find・InStr・ループを徹底活用
✅ InStrRev関数を使うのが正解
VBAには、後ろから検索するための専用関数が用意されています。
それが InStrRev関数 です。
✅ InStrRev関数とは何か
InStrRevは、
文字列のうしろ(右)から検索するための関数です。
・InStrRev関数の基本構文
InStrRev(文字列, 検索文字)
・戻り値
- 見つかった場合 → 文字の位置
- 見つからない場合 → 0
InStrと戻り値の仕様は同じですが、
検索方向が逆になっています。
参考:【VBA】メソッドの戻り値(返り値)とは?取得方法と活用例
✅ InStrRevの基本的な使用例
Sub InStrRevBasic()
Dim text As String
text = "A-B-C-D"
MsgBox InStrRev(text, "-")
End Sub
結果は、
6
となり、
一番うしろの「-」の位置が取得できます。
✅ InStrRevが実務でよく使われる代表例
・ファイルパスからファイル名を取得する
Sub GetFileName()
Dim path As String
Dim pos As Long
path = "C:\Users\Sample\Documents\report.xlsx"
pos = InStrRev(path, "\")
MsgBox Mid(path, pos + 1)
End Sub
・拡張子を取得する
Sub GetExtension()
Dim fileName As String
Dim pos As Long
fileName = "report.final.xlsx"
pos = InStrRev(fileName, ".")
MsgBox Mid(fileName, pos + 1)
End Sub
参考:【Excel】ファイル形式(拡張子)とは|初心者でも理解できる基本と違い・選び方を徹底解説
✅ InStrRevとMidを組み合わせた王道パターン
「うしろから検索する」処理の多くは、
InStrRev + Mid で完結します。
Mid(text, InStrRev(text, 区切り文字) + 1)
これは、実務で何度も使う 鉄板構文 です。
✅ 見つからない場合を必ず考慮する
InStrRevは、見つからない場合に 0 を返します。
これを考慮しないコードは、実務では非常に危険です。
・存在チェックを入れた安全な例
Sub SafeInStrRev()
Dim text As String
Dim pos As Long
text = "sample"
pos = InStrRev(text, ".")
If pos = 0 Then
MsgBox "区切り文字が見つかりません"
Exit Sub
End If
MsgBox Mid(text, pos + 1)
End Sub
参考:【VBA】文字列操作関数【Mid・Left・Right】|実務で使い倒す完全ガイド
✅ InStrRevでも「同じ文字が複数ある」問題は解決できる
InStrでは苦労していた、
- 最後の「\」
- 最後の「.」
- 最後の「-」
といった処理は、InStrRevを使えば 一発 です。
✅ InStrとInStrRevの使い分け基準
実務では、次の基準で使い分けると迷いません。
・InStrを使うべきケース
- 最初に出てくる位置が欲しい
- 左からの構造が意味を持つ
・InStrRevを使うべきケース
- 最後に出てくる位置が欲しい
- 拡張子・ファイル名・末尾情報を扱う
✅ InStrRevは「万能」ではない
InStrRevは便利ですが、万能ではありません。
・向いていないケース
- 2番目に後ろの位置が欲しい
- 条件付きで検索したい
- 複雑なパターンマッチ
こうした場合は、
InStr + ループ
や
正規表現
を検討する必要があります。
✅ InStrRevをFunction化して再利用する
実務では、同じ処理を何度も使います。
Function化することで、保守性が大きく向上します。
Function GetLastAfter(ByVal text As String, _
ByVal delimiter As String) As String
Dim pos As Long
pos = InStrRev(text, delimiter)
If pos = 0 Then
GetLastAfter = ""
Exit Function
End If
GetLastAfter = Mid(text, pos + Len(delimiter))
End Function
✅ セルの値を対象にした実務例
Sub UseInCell()
Dim val As String
val = Range("A1").Value
Range("B1").Value = GetLastAfter(val, "\")
End Sub
✅ 実務でよくあるNGパターン
・InStrで無理やり後ろ検索しようとしている
・InStrRevの戻り値0を考慮していない
・可読性の低いネスト構造
これらは、後から必ず修正コストになります。
参考:【VBA】Function で複数の戻り値を返す方法と活用例
✅ 業務自動化での活用シーン
InStrRevを使いこなせるようになると、
- ファイル統合処理
- CSV・ログ解析
- フォルダ構成の自動判定
- RPA前処理
など、実務自動化の精度と安定性が一気に向上します。
✅ まとめ:InStrRevを理解し、うしろから検索できるVBAを書く
- InStrは前から検索する関数
- 後ろから検索したい場合はInStrRevを使う
- 戻り値0のチェックは必須
- InStrRev + Mid が王道パターン
- Function化で再利用性を高める
「文字列のうしろから特定の文字を検索する」という処理は、
VBA文字列操作の中でも実務頻度が非常に高い重要技術です。
今回の内容をしっかり押さえておけば、
文字列操作で悩む時間は確実に減り、
より本質的な業務自動化設計に集中できるようになります。