VBAテクニック集 VBA一覧 文法・構文 関数・イベント

【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法|InStrRev含めた解説

Excel VBAで文字列を扱っていると、「特定の文字がどこにあるか」を調べたい場面は非常に多くあります。
ファイル名、パス、CSVデータ、ログ、ユーザー入力文字列など、実務で扱うデータはほぼ例外なく文字列を含んでいます。

その中でも特に多いのが、次のような要望です。

  • ファイルパスの最後の「\」の位置を知りたい
  • 拡張子の直前の「.」を後ろから探したい
  • 「最後に出てくる区切り文字」を基準に分割したい
  • 同じ文字が複数ある中で一番うしろの位置を取得したい

こうした処理を 前から探す InStr だけで書こうとして失敗する ケースは、実務では非常に多く見られます。

この記事では、

  • InStr関数の基本
  • 「うしろから検索したい」ときの正しい考え方
  • InStrを使った後方検索の工夫
  • 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初心者にも理解しやすい

デメリット


 

✅ 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文字列操作の中でも実務頻度が非常に高い重要技術です。

今回の内容をしっかり押さえておけば、
文字列操作で悩む時間は確実に減り、
より本質的な業務自動化設計に集中できるようになります。

参考:【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)

    -VBAテクニック集, VBA一覧, 文法・構文, 関数・イベント