はじめに
”C:\temp\sample.txt” などのフルパスから、ファイル名のみを取り出す方法を見ていきます。
ファイルの存在が明らかな場合は、Dir関数を使う方法が便利ですが、今回はフルパスを文字列と捉えてそこからファイル名のみを抽出する方法を考えてみます。
Dir関数の使い方は以下を参照してください。
・Dir関数の基本的な使い方
InStrRev関数を使った方法
InStr関数は、文字列中から検索文字が見つかった場所を返しますが
InStr関数は、文字列中から検索文字が最初に見つかった場所を返しますが、InStrRev関数は、最後から探す関数になります。
フルパスは、¥マークで区切られていますので、後ろから探して最初に見つかった位置から右側がファイル名という事になります。コードを見てみましょう。
Sub getFilename1()
Dim FileName As String
Dim path As String
path = "C:\temp\sample.txt"
FileName = Mid(path, InStrRev(path, "\") + 1)
Debug.Print FileName
End Sub
このサンプルでは、まず InStrRev関数で最後に出てくる¥マークを見つけています。最後から検索すると言っても返してくるのは「最初から何番目」の値なので注意しましょう。(今回は8を返します)

¥マークの位置が特定できたら、そこから後ろの部分を取り出します。取り出すにはMid関数を用いると良いでしょう。Mid関数の使い方は以下のようになります。第3引数を省略すると文字列の最後までが対象となります。
Mid(対象文字列,開始位置,[長さ])
¥マーク位置の次から取り出すので +1 となっています。
【おまけ】ファイル名、拡張子を抽出
上記を応用すれば、ファイル名だけでなく、拡張子、拡張子のないファイル名も抽出できます。
Sub sample()
Dim filename As String, path As String
path = "C:\temp\text\sample.txt"
Debug.Print path
filename = Mid(path, InStrRev(path, "\") + 1) 'ファイル名 sample.txt
Debug.Print filename
Debug.Print Mid(filename, 1, InStrRev(filename, ".") - 1) '拡張子なしのファイル名 sample
Debug.Print Mid(filename, InStrRev(filename, ".") + 1) '拡張子 txt
End Sub
Split関数を使った方法
フルパスは¥マークが区切りと考えられるので、Split関数で配列に分解して最後の要素を取り出すという方法も考えられます。
Sub getFilename2()
Dim FileName As String
Dim path As String
Dim arr
path = "C:\temp\sample.txt"
arr = Split(path, "\")
FileName = arr(UBound(arr))
Debug.Print FileName
End Sub
Split関数で受ける変数はバリアント型の変数にしておいた方が良いでしょう。(分割されなかった場合にNULLが返って来るためです)
分割された配列は Arr に入ります。最後の要素番号(インデックス)は UBound で得られるので、arr(UBound(arr)) とすれば、ファイル名が抽出できます。
まとめ
今回は文字列操作で、フルパスからファイル名を取り出す方法を考えてみました。文字列操作は色々な方法がありますので、他にも方法はあると思います。
文字列操作に関しては、ファイルパス以外でも使う事が多いので慣れておくと便利です。また、今回は触れませんでしたが、実際のプログラムではエラー処理も必要になって来るでしょう。
エラー対策としては、対象文字列(フルパス)と区切値文字(\)が対象となると思います。今回の場合、対象文字列が空白の場合、InStrRev関数を使った例ではそのまま空白が返りますが、Split関数を使った例ではエラーが発生します。
区切り文字が対象文字列に無い場合は、対象文字列がそのまま返る事になるでしょう。
参考にしてみてください。
コメント