今回は、ファイルパスからファイル名を取得する方法について解説します。
ファイル名だけでなく、「ファイル名 + 拡張子」「ファイル名のみ」「拡張子のみ」の3パターンを取得する方法もご紹介します。
- 構文から引数まで、基礎知識から丁寧に解説します。
- 「ファイル名 + 拡張子」「ファイル名のみ」「拡張子のみ」の3パターンの取得方法が分かります。
- FileSystemObjectを使用する方法、使用せずに取得する方法を解説します。
- コピペで使える実践的なコードを掲載しています。
前提
関連プロパティ(FileSystemObject)
FileSystemObjectには、ファイル名を取得するプロパティが複数用意されています。
# | プロパティ | 説明 |
---|---|---|
1 | GetFileName | ファイルパスから「ファイル名 + 拡張子」の文字列を取得する |
2 | GetBaseName | ファイル名 及び ファイルパスから「ファイル名」のみを取得する |
3 | GetExtensionName | ファイル名 及び ファイルパスから「拡張子」のみを取得する |
FileSystemObjectについては、以下の記事にて詳しく解説しています。
FileSystemObjectを使用しない場合
FileSystemObjectを使用しない場合、VBAでは取得する部品は存在しないため、ディレクトリの階層を示す「\」という文字や、拡張子の「.」をキーワードにして切り出す部品を自作する必要があります。
後述のサンプルコードにて解説しています。
参考:ファイル名を取得する(FileSystemObject使用なし)
基本情報
GetFileNameプロパティ
ファイルパスから「ファイル名 + 拡張子」を取得するには、FileSystemObjectのGetFileNameプロパティを使用します。
構文
FileSystemObject.GetFileName(Path)
※緑色は引数です。
引数
# | 引数 | 必須/任意 | 説明 |
---|---|---|---|
1 | Path | 必須 | ファイルパスを指定 |
GetBaseNameプロパティ
ファイル名 及び ファイルパスから「ファイル名」のみ取得するには、FileSystemObjectのGetBaseNameプロパティを使用します。
拡張子は「.」以降の文字列のことを指しますが「Test.File.txt」など、ファイル名の途中に「.」がある場合でも、「Test.File」という文字列を返却します。
構文
FileSystemObject.GetBaseName(Path)
※緑色は引数です。
引数
# | 引数 | 必須/任意 | 説明 |
---|---|---|---|
1 | Path | 必須 | ファイル名 及び ファイルパスを指定 |
GetExtensionNameプロパティ
ファイル名 及び ファイルパスから「拡張子」のみ取得するには、FileSystemObjectのGetExtensionNameプロパティを使用します。
拡張子は「.」以降の文字列のことを指しますが「Test.File.txt」など、ファイル名の途中に「.」がある場合でも、「txt」という文字列を返却します。
構文
FileSystemObject.GetExtensionName(Path)
※緑色は引数です。
引数
# | 引数 | 必須/任意 | 説明 |
---|---|---|---|
1 | Path | 必須 | ファイル名 及び ファイルパスを指定 |
サンプルコード
ファイル名を取得する(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
最後に
今回は、ファイルパスからファイル名を取得する方法について解説しました。
開いているブック名の存在チェックなどで、頻繁に使用するため、是非この記事を参考にコーディングをしてみてください!
コメント