VBAの「FileDateTime関数」の使い方についてご説明します。
指定したファイルの作成日時や最終更新日時を取得したい場合に使用する関数です。
指定したファイルの日時の取得から、指定したフォルダ内のファイル全ての日時を取得する方法をご紹介したいと思います。
作成日時、更新日時、アクセス日時を指定して取得したい場合は、「ファイルの作成日時、更新日時、アクセス日時の取得方法」をご覧ください
その他のファイルの操作については下記記事をご覧ください。
1.FileDateTime関数の使い方
「FileDateTime関数」は指定したファイルの作成日時または最終更新日時を取得します。
次のように記述します。
FileDateTime(PathName)
引数PathNameには日時を取得したいファイル名の文字列式を指定します。
フォルダのパスを指定する事もでき、省略するとカレントフォルダ内が指定されたことになります。
現在のカレントフォルダを調べるのも手間になるので、フォルダも指定するか意図的にカレントフォルダを指定する事をおすすめします。
また、ファイル名にワイルドカードを指定する事が出来ないため、一度に複数のファイルを指定する事が出来ません。
指定したファイルが存在しない場合はエラーとなるため、ファイルの存在を確認してから取得する事でエラーを回避できます。
2.FileDateTime関数のサンプルコード
基本的なファイル名を指定して取得する方法と、指定したフォルダ内のすべてのファイルの日時を取得する方法をご紹介します。
今回はCドライブにSampleというフォルダを作成し、その中に「Test01.xlsx」~ 「Test04.xlsx」 というファイルを作成しましたので、そのファイルの日時を取得したいと思います。
指定したファイルの日時を取得するコード
まずは指定したファイルの日時を取得する方法です。
上記の「Test01.xlsx」を指定して取得したいと思います。
Sub Sample1()
Dim FileTime As Date
FileTime = FileDateTime("C:\Sample\Test01.xlsx")
MsgBox FileTime
End Sub
コードの説明
変数「FileTime」をDate型で指定して、取得したファイルの日時を格納します。
「FileTime = FileDateTime(“C:\Sample\Test01.xlsx”)」で指定したファイルを取得しています。
「MsgBox FileTime」で取得したファイルを表示しています。
また、取得したファイルは「Format関数」を使用すれば表示形式を変更できます。
こんな感じです。
MsgBox Format(FileTime, "yyyy/mm/dd hh:mm:ss")
指定したフォルダ内のすべてのファイルの日時を取得するコード
次は少し工夫して指定したフォルダ内のすべてのファイルの日時を取得する方法です。
指定したフォルダをループして1つずつファイルの日時を取得します。
「Dir関数」や「FileSystemObject」を使う方法があります。
Dir関数でループする方法
Sub Sample2()
Dim FileTime As Date
Dim FileName As String
With CreateObject("WScript.Shell")
.CurrentDirectory = "C:\Sample\"
End With
FileName = Dir("*.xlsx")
Do While FileName <> ""
FileTime = FileDateTime(FileName)
FileName = Dir()
Loop
End Sub
FileSystemObjectでループする方法
Sub Sample3()
Dim FolderPath As String
Dim FSO As Object
Dim FileName As Object
Dim FileTime As String
'ファイルシステムオブジェクトをセットする
Set FSO = CreateObject("Scripting.FileSystemObject")
FolderPath = "C:\Sample" 'フォルダを指定する
'取得したフォルダ内のファイルをループ
For Each FileName In FSO.GetFolder(FolderPath).Files
FileTime = FileDateTime(FileName)
Next
End Sub
どちらも結果は同じです。
Dir~Loopで指定したフォルダ内のファイルをループするか、「FileSystemObject」を使用して取得したファイルを「For Each FileName In FSO.GetFolder(FolderPath).Files」でループするかの違いです。
ファイル名の指定であったり、拡張子の指定が必要になる場合はワイルドカードの使用できる「Dir関数」を使用する事をおすすめします。