はじめに
ファイルのフルパスから拡張子だけを取り出したい、あるいはファイル名だけを抽出したいといった場面で、「文字列の後ろ側から特定の文字を検索したい」ことがあります。こうしたときに便利なのがInStrRev関数です。
InStr関数が文字列の先頭から検索するのに対し、InStrRev関数は文字列の末尾から検索します。この記事では、InStrRev関数の基本構文から、InStrとの違い、ファイルパスから拡張子やファイル名を取り出す実務的な使い方まで解説します。
InStrRev関数の基本構文
InStrRev関数は、指定した文字列の中から検索文字列を後ろから探し、最初に見つかった位置を返します。
InStrRev(文字列, 検索文字列, [検索開始位置], [比較方法])
主な引数は以下の通りです。
- 文字列: 検索対象の文字列
- 検索文字列: 探したい文字列
- 検索開始位置(省略可): 末尾から数えて何文字目から検索を始めるか(省略時は文字列全体)
- 比較方法(省略可):
vbBinaryCompare(大文字小文字を区別)やvbTextCompare(区別しない)を指定
見つかった場合は文字列の先頭からの位置(1から始まる数値)を返し、見つからない場合は0を返します。
基本的な使用例
まずはシンプルな例で、InStrとInStrRevの違いを確認します。
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を使った文字列処理を覚えておくと、パスの分解や拡張子判定がぐっと楽になります。


コメント