皆さん、こんにちは。Excel VBA講師のベテラン・タカハシです。
日々の業務で、「このフォルダにあるファイル、最後に更新されたのはいつだろう?」「このデータはいつ作成されたものかな?」と確認したくなることはありませんか?Windowsのエクスプローラーで一つずつ右クリックしてプロパティを確認するのは、ファイル数が数個なら良いですが、数百個となると現実的ではありません。
VBAを使えば、こうしたファイル属性の取得は一瞬です。今回は、VBAでファイル日時を取得する際の「鉄板テクニック」である「FileSystemObject(FSO)」を使用した手法を、プロの視点から徹底解説します。
なぜ「FileDateTime関数」ではなく「FileSystemObject」なのか?
VBAでファイルの日時を取得する方法として、古くから存在する「FileDateTime関数」があります。しかし、実務レベルで開発を行う際、私は迷わず「FileSystemObject(FSO)」を推奨します。
理由は明確です。FSOはオブジェクト指向で設計されており、単に日時を取得するだけでなく、ファイルのパス操作、属性の変更、存在確認、さらにはフォルダ内の全ファイルをループ処理する際など、拡張性が非常に高いからです。また、FileDateTime関数は「最終更新日時」しか取得できませんが、FSOなら「作成日時」「最終アクセス日時」もスマートに取得可能です。
FileSystemObjectを使うための準備
FSOを使用するには、主に2つの方法があります。
1. **参照設定を利用する方法**
VBE(Visual Basic Editor)の「ツール」→「参照設定」から「Microsoft Scripting Runtime」にチェックを入れる。これにより、IntelliSense(入力補完)が効くようになり、開発効率が劇的に向上します。
2. **遅延バインディングを利用する方法**
コード内で `CreateObject(“Scripting.FileSystemObject”)` を記述する方法です。配布先のPCで参照設定が外れるトラブルを防げるため、配布用ツールを作成する際は、こちらの方法が好まれます。
今回は、どちらの環境でも応用が利くよう、遅延バインディングをベースに解説します。
基本コード:ファイルの各日時を取得する
まずは、特定のファイルの「作成日時」「最終更新日時」「最終アクセス日時」を取得する基本コードを見てみましょう。
Sub GetFileDateTimeInfo()
Dim fso As Object
Dim fileObj As Object
Dim filePath As String
‘ 対象ファイルのパスを指定
filePath = “C:\Test\Sample.xlsx”
‘ FSOの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ファイルが存在するかチェック
If fso.FileExists(filePath) Then
Set fileObj = fso.GetFile(filePath)
‘ 各種日時を出力
Debug.Print “作成日時: ” & fileObj.DateCreated
Debug.Print “最終更新日時: ” & fileObj.DateLastModified
Debug.Print “最終アクセス日時: ” & fileObj.DateLastAccessed
Else
MsgBox “ファイルが見つかりません。”
End If
‘ オブジェクトの解放
Set fileObj = Nothing
Set fso = Nothing
End Sub
このコードを実行すると、イミディエイトウィンドウに日付と時刻が表示されます。非常にシンプルですが、これがすべての基本となります。
実務での応用:フォルダ内の全ファイルリストを作成する
実務では、単一のファイルよりも「特定のフォルダ内にある全ファイルの更新日時を一覧化したい」というニーズが圧倒的に多いです。これこそがFSOの本領発揮です。
以下のコードは、指定したフォルダ内の全ファイルをループし、Excelシート上にリストアップする実践的なスクリプトです。
Sub ListFilesWithDateTime()
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim targetPath As String
Dim row As Long
targetPath = “C:\Test\” ‘ 対象フォルダパス
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetPath) Then Exit Sub
Set folder = fso.GetFolder(targetPath)
‘ ヘッダーの作成
Cells(1, 1).Value = “ファイル名”
Cells(1, 2).Value = “作成日時”
Cells(1, 3).Value = “最終更新日時”
row = 2
‘ ファイルループ
For Each file In folder.Files
Cells(row, 1).Value = file.Name
Cells(row, 2).Value = file.DateCreated
Cells(row, 3).Value = file.DateLastModified
row = row + 1
Next file
MsgBox “リストアップが完了しました!”
End Sub
プロが教える「陥りやすい罠」と対策
VBAでファイル日時を扱う際、いくつか注意すべき点があります。
**1. 日時のフォーマット問題**
`fileObj.DateLastModified` は日付型(Date)として返されます。これをExcelシートに書き出す際、PCのシステム設定やセルの書式設定によって表示が崩れることがあります。確実に表示したい場合は、`Format(fileObj.DateLastModified, “yyyy/mm/dd hh:mm:ss”)` のように、明示的に文字列変換して出力することをお勧めします。
**2. 権限とアクセスエラー**
システムファイルや、他のユーザーが排他制御しているファイルに対してアクセスしようとすると、実行時エラーが発生することがあります。必ず `On Error Resume Next` を適切に配置し、エラーをハンドリングする仕組みを入れておきましょう。
**3. ネットワークドライブの遅延**
共有サーバー上のファイルは、ローカル環境よりも取得に時間がかかる場合があります。数千個のファイルを処理する場合、画面の更新を停止(`Application.ScreenUpdating = False`)させることで、処理速度が大幅に向上します。
まとめ:VBAで「管理」を自動化しよう
ファイルの作成日時や更新日時を取得することは、単なるデータ収集ではありません。それは「誰がいつファイルを触ったか」という履歴を管理し、業務の透明性を高めるための第一歩です。
今回紹介したFileSystemObjectは、習得してしまえば「フォルダ内のファイル操作」において怖いものなしの強力な武器になります。ぜひ、ご自身の業務で「このフォルダのファイル、最後にいつ更新されたか全部知りたい」という場面があれば、このコードをコピーして試してみてください。
VBAは、一度自動化の仕組みを作ってしまえば、その後一生、その作業から解放してくれます。皆さんの事務作業が、一秒でも早く終わることを願っています。
それでは、また次回の講座でお会いしましょう!
