【ExcelVBA・マクロ】InStrRev関数の使い方|文字列を後ろから検索する方法(拡張子・ファイル名抽出)【コピペOK】

ExcelVBA
スポンサーリンク
スポンサーリンク

はじめに

ファイルのフルパスから拡張子だけを取り出したい、あるいはファイル名だけを抽出したいといった場面で、「文字列の後ろ側から特定の文字を検索したい」ことがあります。こうしたときに便利なのがInStrRev関数です。

InStr関数が文字列の先頭から検索するのに対し、InStrRev関数は文字列の末尾から検索します。この記事では、InStrRev関数の基本構文から、InStrとの違い、ファイルパスから拡張子やファイル名を取り出す実務的な使い方まで解説します。

InStrRev関数の基本構文

InStrRev関数は、指定した文字列の中から検索文字列を後ろから探し、最初に見つかった位置を返します。

InStrRev(文字列, 検索文字列, [検索開始位置], [比較方法])

主な引数は以下の通りです。

  • 文字列: 検索対象の文字列
  • 検索文字列: 探したい文字列
  • 検索開始位置(省略可): 末尾から数えて何文字目から検索を始めるか(省略時は文字列全体)
  • 比較方法(省略可): vbBinaryCompare(大文字小文字を区別)やvbTextCompare(区別しない)を指定

見つかった場合は文字列の先頭からの位置(1から始まる数値)を返し、見つからない場合は0を返します。

基本的な使用例

まずはシンプルな例で、InStrInStrRevの違いを確認します。

Sub CompareInStrAndInStrRev()

    Dim sampleText As String
    sampleText = "sample.data.report.xlsx"

    Debug.Print InStr(sampleText, ".")       ' 先頭から検索 → 7
    Debug.Print InStrRev(sampleText, ".")    ' 末尾から検索 → 19

End Sub

InStrは最初に見つかった「.」の位置(先頭から7文字目)を返しますが、InStrRevは最後に見つかった「.」の位置(19文字目、拡張子の直前)を返します。ファイル名のように「.」が複数含まれる文字列を扱う場合、この違いが重要になります。

実務例1:ファイルパスから拡張子を取り出す

InStrRevを使えば、最後の「.」以降の文字列を取り出すことで、拡張子だけを正確に抽出できます。

Function GetFileExtension(filePath As String) As String

    Dim dotPos As Long
    dotPos = InStrRev(filePath, ".")

    If dotPos = 0 Then
        GetFileExtension = ""
    Else
        GetFileExtension = Mid(filePath, dotPos + 1)
    End If

End Function

Sub TestGetFileExtension()

    Dim ext As String
    ext = GetFileExtension("C:\Users\report\sample.data.report.xlsx")

    Debug.Print ext    ' → xlsx

End Sub

ファイル名に「.」が複数含まれていても、最後の「.」以降だけを正しく取得できるため、sample.data.report.xlsxのようなファイルでも安全に拡張子「xlsx」を抽出できます。

実務例2:フルパスからファイル名だけを取り出す

フォルダの区切り文字「\」も、InStrRevで末尾から検索することで、最後の「\」以降のファイル名部分を取り出せます。

Function GetFileNameFromPath(filePath As String) As String

    Dim slashPos As Long
    slashPos = InStrRev(filePath, "\")

    If slashPos = 0 Then
        GetFileNameFromPath = filePath
    Else
        GetFileNameFromPath = Mid(filePath, slashPos + 1)
    End If

End Function

Sub TestGetFileNameFromPath()

    Dim fileName As String
    fileName = GetFileNameFromPath("C:\Users\report\2026\sample.xlsx")

    Debug.Print fileName    ' → sample.xlsx

End Sub

フォルダの階層がいくつあっても、最後の「\」以降だけを取得するため、常に正しくファイル名部分だけを抽出できます。

実務例3:フォルダパスだけを取り出す

逆に、ファイル名を除いたフォルダパスだけが欲しい場合も、InStrRevで「\」の位置を特定し、そこまでをLeft関数で切り出せば取得できます。

Function GetFolderPath(filePath As String) As String

    Dim slashPos As Long
    slashPos = InStrRev(filePath, "\")

    If slashPos = 0 Then
        GetFolderPath = ""
    Else
        GetFolderPath = Left(filePath, slashPos - 1)
    End If

End Function

Sub TestGetFolderPath()

    Dim folderPath As String
    folderPath = GetFolderPath("C:\Users\report\2026\sample.xlsx")

    Debug.Print folderPath    ' → C:\Users\report\2026

End Sub

GetFileNameFromPathとこのGetFolderPathを組み合わせれば、1つのフルパスから「フォルダパス」と「ファイル名」をそれぞれ分割して取得できます。

検索開始位置を指定して途中から検索する

InStrRevの第3引数に検索開始位置を指定すると、末尾から数えて指定した文字数の位置から検索を始められます。すでに見つけた位置より前の部分をさらに検索したい場合などに使います。

Sub SearchFromSpecificPosition()

    Dim sampleText As String
    sampleText = "2026-01-15_2026-02-20_report.xlsx"

    Dim firstDotFromEnd As Long
    firstDotFromEnd = InStrRev(sampleText, "_")

    Dim secondDotFromEnd As Long
    secondDotFromEnd = InStrRev(sampleText, "_", firstDotFromEnd - 1)

    Debug.Print firstDotFromEnd     ' 最後の "_" の位置
    Debug.Print secondDotFromEnd    ' その手前にある "_" の位置

End Sub

最初に見つけた位置の1文字手前を検索開始位置に指定することで、2つ目・3つ目と順番に区切り文字の位置をさかのぼって取得できます。

まとめ

InStrRev関数を使えば、文字列を末尾から検索でき、拡張子やファイル名の抽出といった実務的な文字列処理を簡単に自動化できます。

  • InStrは先頭から、InStrRevは末尾から検索する
  • 拡張子の抽出には、最後の「.」の位置をInStrRevで特定しMidで切り出す
  • ファイル名・フォルダパスの分割には、最後の「\」の位置を利用する
  • 第3引数の検索開始位置を使えば、複数回の区切り文字も順番に取得できる

フォルダ内のファイルを一括処理するマクロを作る際は、InStrRevを使った文字列処理を覚えておくと、パスの分解や拡張子判定がぐっと楽になります。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました