VBAで特定のファイルやフォルダ内のファイル一覧を扱う際、ファイル名だけでなく、そのファイルの拡張子、サイズ、最終更新日といった詳細な情報(メタデータ)を取得したい場面は非常に多くあります。
FileSystemObject (FSO)
を使えば、ファイルを開くことなく、これらの情報を簡単かつ高速に取得できます。この記事では、FSOを使ってファイルの様々なプロパティにアクセスする方法を、具体的なコードと共に解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、このマクロが書かれているExcelファイル自身の詳細情報を取得し、アクティブシートのB列に書き出すサンプルコードです。
'参照設定: Microsoft Scripting Runtime
Sub GetFileProperties()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim targetFile As File
Dim targetFilePath As String
'--- 調査対象のファイルパスを設定 ---
targetFilePath = ThisWorkbook.FullName
' ファイルが存在しない場合は処理を中断
If Not fso.FileExists(targetFilePath) Then
MsgBox "対象ファイルが見つかりません。", vbCritical
Exit Sub
End If
'--- 1. FSOのメソッドでパス文字列から情報を取得 ---
Range("B1").Value = fso.GetBaseName(targetFilePath) ' ベース名 (拡張子なし)
Range("B2").Value = fso.GetExtensionName(targetFilePath) ' 拡張子のみ
'--- 2. Fileオブジェクトを取得し、そのプロパティから情報を取得 ---
Set targetFile = fso.GetFile(targetFilePath)
With targetFile
Range("B3").Value = .DateCreated ' 作成日時
Range("B4").Value = .DateLastAccessed ' 最終アクセス日時
Range("B5").Value = .DateLastModified ' 最終更新日時
Range("B6").Value = .Drive ' ドライブ名
Range("B7").Value = .ParentFolder ' 親フォルダのパス
Range("B8").Value = Format(.Size / 1024, "#,##0") & " KB" ' サイズ(KB単位)
Range("B9").Value = .Type ' ファイルの種類
End With
' オブジェクトを解放
Set targetFile = Nothing
Set fso = Nothing
MsgBox "ファイルの情報を取得しました。"
End Sub
コードのポイント解説
FSOでファイル情報を取得するには、大きく分けて2つのアプローチがあります。
① パス文字列を直接操作するメソッド
FSOオブジェクトは、ファイルパスの文字列を引数として、特定の情報だけを抜き出す便利なメソッドを持っています。
.GetBaseName(ファイルパス)
:Report.xlsx
からReport
の部分だけを返します。.GetExtensionName(ファイルパス)
:Report.xlsx
からxlsx
の部分だけを返します。
② File
オブジェクトのプロパティを利用する
Set targetFile = fso.GetFile(targetFilePath)
...
Range("B3").Value = targetFile.DateCreated
.GetFile
メソッドで、まずファイル全体を表すFile
オブジェクトを取得します。一度オブジェクトを取得すれば、そのプロパティを参照するだけで、様々な情報にアクセスできます。
プロパティ | 説明 |
.Name | ファイル名(拡張子を含む) |
.Path | ファイルのフルパス |
.ParentFolder | 親フォルダのパス |
.Size | ファイルサイズ(バイト単位) |
.Type | ファイルの種類(例: “Microsoft Excel ワークシート”) |
.DateCreated | 作成日時 |
.DateLastModified | 最終更新日時 |
.DateLastAccessed | 最終アクセス日時 |
.Drive | ドライブ名(例: “C:”) |
【応用】フォルダ内の全ファイル情報を一覧化する
このテクニックを応用すれば、指定したフォルダ内の全ファイルの詳細情報をシートに書き出す、といった実用的なマクロも作成できます。
Sub ListUpAllFileProperties()
Dim fso As New FileSystemObject
Dim targetFolder As Folder
Dim f As File
Dim i As Long
Set targetFolder = fso.GetFolder(ThisWorkbook.Path)
i = 2 ' 2行目から書き出し開始
' ヘッダーを書き込み
Range("A1:D1").Value = Array("ファイル名", "サイズ(KB)", "種類", "最終更新日")
' フォルダ内の全ファイルをループ
For Each f In targetFolder.Files
Cells(i, 1).Value = f.Name
Cells(i, 2).Value = f.Size / 1024
Cells(i, 3).Value = f.Type
Cells(i, 4).Value = f.DateLastModified
i = i + 1
Next f
Columns("A:D").AutoFit ' 列幅を自動調整
End Sub
まとめ
FSOを使えば、ファイルのメタデータに簡単にアクセスできます。
- ファイル名や拡張子だけが欲しい場合は、
.GetBaseName
や.GetExtensionName
が便利。 - サイズや更新日時など、より多くの情報が必要な場合は、まず
.GetFile
でFile
オブジェクトを取得し、そのプロパティを参照する。
これらの機能を使いこなすことで、ファイルの整理や、ログの記録、システム連携など、VBAでできることの幅が大きく広がります。