HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > フルパスからファイル名を取得する

即効テクニック

ファイル操作関連のテクニック

フルパスからファイル名を取得する

(Excel 97/2000/2002/2003/2007)
フルパスから純粋なファイル名を抜き出すにはDir関数が便利です。Dir関数は、ファイルが存在した場合、パスを含まない純粋なファイル名を返します。

Sub Sample1()
    Dim FileName As String
    FileName = "C:\Work\Sub\Book1.xls"
    MsgBox Dir(FileName)
End Sub
今回は「C:\Work\Sub\Book1.xls」を文字列として操作して、純粋なファイル名を取得する方法を考えてみましょう。 まず思いつくのは「\」の位置を頼りに分割する方法です。 フルパスから「\」の位置を調べ、一番最後の「\」までがフォルダ名であり、その後ろ全部がファイル名となります。 任意の文字を検索するにはInStr関数が一般的ですが、今回のように「一番最後」を調べるのは少々面倒くさいです。 InStr関数を使うなら、次のようになります。 次のコードは、フルパスの文字列からファイル名だけを調べて表示します。
Sub Sample2()
    Dim FileName As String, n As Long, Pos As Long
    FileName = "C:\Work\Sub\Book1.xls"
    Do
        n = InStr(n + 1, FileName, "\")
        If n > 0 Then
            Pos = n
        Else
            Exit Do
        End If
    Loop
    MsgBox Mid(FileName, Pos + 1)
End Sub
フルパスの先頭から「\」の位置を調べて、最後に見つかった位置から後ろをMid関数で抜き出しています。 InStr関数は、検索する文字を先頭から探しますので「一番最後」の「\」を見つけるには先頭から順に調べて、後ろに「\」が"見つからない場所"を調べなければなりません。 しかし、「一番最後」の「\」ということは、フルパスの文字列を後ろから検索して最初に見つかった「\」という考え方もできます。 実はVBAには、検索文字を先頭から探すInStr関数だけでなく、検索文字を後ろから探すInStrRev関数もあります。 これを使うと同じ処理を簡単に行えます。
Sub Sample3()
    Dim FileName As String, Pos As Long
    FileName = "C:\Work\Sub\Book1.xls"
    Pos = InStrRev(FileName, "\")
    MsgBox Mid(FileName, Pos + 1)
End Sub
もうひとつ、Excel 2000で追加されたSplit関数を使う方法もあります。 Split関数は、指定した文字で文字列を区切る関数で、区切った結果を配列で返します。 たとえば「C:\Work\Sub\Book1.xls」という文字列を「\」で区切ると、 C: Work Sub Book1.xls という4つの要素を持つ配列を返しますので、4番目(一番最後)の要素を調べます。
Sub Sample4()
    Dim FileName As String, tmp As Variant
    FileName = "C:\Work\Sub\Book1.xls"
    tmp = Split(FileName, "\")
    MsgBox tmp(Ubound(tmp))
End Sub
変数tmpはバリアント型で宣言していますので、Split関数の結果を受けて配列になります。 Ubound関数は、配列に含まれる最終要素のインデックス値を返します。 ●補足● InStrRev関数はExcel 2000で追加された関数ですので、それ以前のバージョンであるExcel 97やExcel 95/5.0では使用できません。