【Excel VBA】ファイルパスからファイル名を取得する(GetFileName/GetBaseName/GetExtensionName)

はじめに

今回は、ファイルパスからファイル名を取得する方法について解説します。
ファイル名だけでなく、「ファイル名 + 拡張子」「ファイル名のみ」「拡張子のみ」の3パターンを取得する方法もご紹介します。

この記事を読むメリット
  • 構文から引数まで、基礎知識から丁寧に解説します。
  • 「ファイル名 + 拡張子」「ファイル名のみ」「拡張子のみ」の3パターンの取得方法が分かります。
  • FileSystemObjectを使用する方法、使用せずに取得する方法を解説します。
  • コピペで使える実践的なコードを掲載しています。

前提

関連プロパティ(FileSystemObject)

FileSystemObjectには、ファイル名を取得するプロパティが複数用意されています。

#プロパティ説明
1GetFileNameファイルパスから「ファイル名 + 拡張子」の文字列を取得する
2GetBaseNameファイル名 及び ファイルパスから「ファイル名」のみを取得する
3GetExtensionNameファイル名 及び ファイルパスから「拡張子」のみを取得する
ファイル名取得 – プロパティ

FileSystemObjectについては、以下の記事にて詳しく解説しています。

FileSystemObjectを使用しない場合

FileSystemObjectを使用しない場合、VBAでは取得する部品は存在しないため、ディレクトリの階層を示す「\」という文字や、拡張子の「.」をキーワードにして切り出す部品を自作する必要があります。

後述のサンプルコードにて解説しています。

参考:ファイル名を取得する(FileSystemObject使用なし)

基本情報

GetFileNameプロパティ

ファイルパスから「ファイル名 + 拡張子」を取得するには、FileSystemObjectのGetFileNameプロパティを使用します。

構文

構文

FileSystemObject.GetFileName(Path)

緑色は引数です。

引数

#引数必須/任意説明
1Path必須ファイルパスを指定
GetFileName – 引数

GetFileNameプロパティは文字列を加工するのみであるため、存在しないファイル名を引数に指定してもエラーは発生しません。

GetBaseNameプロパティ

ファイル名 及び ファイルパスから「ファイル名」のみ取得するには、FileSystemObjectのGetBaseNameプロパティを使用します。

拡張子は「.」以降の文字列のことを指しますが「Test.File.txt」など、ファイル名の途中に「.」がある場合でも、「Test.File」という文字列を返却します。

構文

構文

FileSystemObject.GetBaseName(Path)

緑色は引数です。

引数

#引数必須/任意説明
1Path必須ファイル名 及び ファイルパスを指定
GetBaseName – 引数

GetBaseNameプロパティは文字列を加工するのみであるため、存在しないファイル名を引数に指定してもエラーは発生しません。

GetExtensionNameプロパティ

ファイル名 及び ファイルパスから「拡張子」のみ取得するには、FileSystemObjectのGetExtensionNameプロパティを使用します。

拡張子は「.」以降の文字列のことを指しますが「Test.File.txt」など、ファイル名の途中に「.」がある場合でも、「txt」という文字列を返却します。

構文

構文

FileSystemObject.GetExtensionName(Path)

緑色は引数です。

引数

#引数必須/任意説明
1Path必須ファイル名 及び ファイルパスを指定
GetExtensionName- 引数

GetExtensionNameプロパティは文字列を加工するのみであるため、存在しないファイル名を引数に指定してもエラーは発生しません。

サンプルコード

ファイル名を取得する(FileSystemObject)

サンプルコード
Public Sub getFileName()
    Dim fso As New FileSystemObject ' FileSystemObjectインスタンス
    Dim path As String              ' ファイルパス

    ' ファイルパスの設定
    path = "C:\vba-hack\vba\TestFile.txt"

    ' セルに出力する
    Range("A1").Value = fso.GetFileName(path)       ' ファイル名(拡張子あり)
    Range("B1").Value = fso.GetBaseName(path)       ' ファイル名(拡張子なし)
    Range("C1").Value = fso.GetExtensionName(path)  ' 拡張子
End Sub

フォルダ配下すべてのファイル名を取得する

サンプルコード
Public Sub getFileNameForTargetFolder()
    Dim fso As New FileSystemObject ' FileSystemObjectインスタンス
    Dim myFolder As Folder          ' Folderオブジェクト
    Dim myFile As File              ' Fileオブジェクト
    Dim loopCnt As Long             ' ループカウンタ

    ' フォルダオブジェクトを取得
    Set myFolder = fso.GetFolder("C:\vba-hack\vba")

    ' フォルダ配下のファイル数分ループ
    loopCnt = 1
    For Each myFile In myFolder.Files

        Cells(loopCnt, 1).Value = fso.GetFileName(myFile.Path)      ' ファイル名(拡張子あり)
        Cells(loopCnt, 2).Value = fso.GetBaseName(myFile.Path)      ' ファイル名(拡張子なし)
        Cells(loopCnt, 3).Value = fso.GetExtensionName(myFile.Path) ' 拡張子
        loopCnt = loopCnt + 1
    Next myFile
End Sub

上記は、FileSystemObjectのFIle及びFolderオブジェクトを利用して作成しています。
File及びFolderオブジェクトについては、以下の記事にて詳しく解説しています。

ファイル名を取得する(FileSystemObject使用なし)

呼び出し – メインプロシージャ

サンプルコード
Public Sub getFileNameForNonUseFSO()
    Dim filePath As String  ' ファイルパス

    ' ファイルパスを指定
    filePath = "C:\vba-hack\vba\TestFile.txt"

    ' セルに情報を出力
    Range("A1").Value = getFileName(filePath)       ' ファイル名(拡張子あり)
    Range("B1").Value = getBaseName(filePath)       ' ファイル名(拡張子なし)
    Range("C1").Value = getExtensionName(filePath)  ' 拡張子
End Sub

ファイル名(拡張子あり)取得 – サブプロシージャ

サンプルコード
Private Function getFileName(ByVal filePath As String) As String
    Dim pos As String

    ' 「\」の位置を検索
    pos = InStrRev(filePath, "\")

    ' ファイル名(拡張子あり)を取得し返却する
    getFileName = Mid(filePath, pos + 1)
End Function

ファイル名(拡張子なし)取得 – サブプロシージャ

サンプルコード
Private Function getBaseName(ByVal filePath As String) As String
    Dim posStart As String
    Dim posEnd As String

    ' 「\」の位置を検索
    posStart = InStrRev(filePath, "\")
    posEnd = InStrRev(filePath, ".")

    ' ファイル名(拡張子なし)を取得し返却する
    getBaseName = Mid(filePath, posStart + 1, (posEnd - posStart) - 1)
End Function

拡張子取得 – サブプロシージャ

サンプルコード
Private Function getExtensionName(ByVal filePath As String) As String
    Dim pos As String

    ' 「\」の位置を検索
    pos = InStrRev(filePath, ".")

    ' ファイル名(拡張子あり)を取得し返却する
    getExtensionName = Mid(filePath, pos + 1)
End Function

最後に

今回は、ファイルパスからファイル名を取得する方法について解説しました。
開いているブック名の存在チェックなどで、頻繁に使用するため、是非この記事を参考にコーディングをしてみてください!

オススメの書籍
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA