VBAでファイルの作成日時、更新日時、アクセス日時の取得方法についてご説明します。
VBAでファイルの操作をしていると、フォルダ内に複数のファイルが存在する中から作成日時や、更新日時の最も新しいファイルを取得したいなどの処理に使います。
また、併せて作成、更新、アクセスの特徴や違いについても簡単にですがご説明したいと思います。
その他のファイルの操作については下記記事をご覧ください。
1.作成日時、更新日時、アクセス日時の違い
ファイルには3つの日時があります。
この日時の違いとそれぞれの日時がどのタイミングで更新されるかについて、簡単にですがご説明します。
日時が作成される
日時 | 説明 |
作成日時 | そのファイルがその場所に作成もしくはコピーされた日時 |
更新日時 | そのファイルが保存などで更新された日時 |
アクセス日時 | そのファイルにプログラムなどでアクセスした日時 |
作成日時と更新日時の前後が逆で、更新日時の方が古いという現象をよく見ます。
これは作成日時がファイルをコピーして作成した際に新しくなることにあります。
1.作成日時、更新日時、アクセス日時の取得方法
まずは作成日時、更新日時、アクセス日時の取得方法についてご説明します。
取得するには「FileSystemObject(ファイルシステムオブジェクト)」を使用します。
FileSystemObjectとは
「FileSystemObject」オブジェクトは、ドライブ、フォルダ、ファイルなどを操作する事ができるオブジェクトです。
FileSystemObjectを使用するには「CreateObject」メソッドを使用して次のように記載します。
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
「FileSystemObject」が使えるようになったら「GetFile関数」で指定したパスのファイルを取得して、ファイルの日時を取得します。
日時を取得するプロパティ
作成日時、更新日時、アクセス日時を取得するには、指定したファイルにそれぞれプロパティを指定します。
プロパティ | 説明 |
DateCreated | 作成日時を取得します。 |
DateLastModified | 更新日時を取得します。 |
DateLastAccessed | アクセス日時を取得します。 |
2.取得するサンプルコード
今回はCドライブにSampleというフォルダを作成し、その中に「Test01.xlsx」というファイルを作成しましたので、そのファイルの日時を取得したいと思います。
ファイルを指定して取得する方法と、フォルダをループしてフォルダ内のファイルの日時をすべて取得する方法のサンプルコードをご紹介したいと思います。
ファイルを指定して取得するコード
コード自体はシンプルですが、指定したファイルが存在しないとエラーとなりますのでご注意ください。
Sub Sample1()
Dim FSO As Object
Dim MyFile As Object
Dim FilePath As String
FilePath = "C:\Sample\Test01.xlsx" 'フォルダとファイルを指定
Set FSO = CreateObject("Scripting.FileSystemObject") 'FSOをセット
Set MyFile = FSO.GetFile(FilePath) 'ファイルを取得
Debug.Print (MyFile.DateCreated) '作成日時
Debug.Print (MyFile.DateLastModified) '更新日時
Debug.Print (MyFile.DateLastAccessed) 'アクセス日時
Set FSO = Nothing
End Sub
「FilePath = “C:\Sample\Test01.xlsx”」でフォルダとファイル名をフルパスで指定します。
「Set FSO = CreateObject(“Scripting.FileSystemObject”)」でFileSystemObjectを使用できるようにセットします。
「Set MyFile = FSO.GetFile(FilePath)」でGetFile(パス)で指定したファイルを取得します。
「MyFile.DateCreated」~「MyFile.DateLastAccessed」でそれぞれ作成日時、更新日時、アクセス日時を取得しています。
フォルダ内のファイルの日時を取得するコード
上記でファイルの日時を取得出来ましたので、少し工夫する事でフォルダ内のファイルすべての日時を取得する事が可能です。
先ほどの「Test01.xlsx」を04まで作成しました。
Sub Sample2()
Dim FSO As Object
Dim MyFolder As Object
Dim FolderPath As String
Dim MyFile As Object
FolderPath = "C:\Sample\" 'フォルダを指定
Set FSO = CreateObject("Scripting.FileSystemObject") 'FSOをセット
Set MyFolder = FSO.GetFolder(FolderPath) 'フォルダを取得
For Each MyFile In MyFolder.Files ' フォルダ内のファイルをループ
Debug.Print (MyFile.DateCreated) '作成日時
Debug.Print (MyFile.DateLastModified) '更新日時
Debug.Print (MyFile.DateLastAccessed) 'アクセス日時
Next
Set FSO = Nothing
End Sub
過去に作ったファイルを適当に使いまわしたので、日付がバラバラですが無事取得出来ました。
変数名の一部を「Flie」から「Folder」などに書き換えていますので、ご注意ください。
「FolderPath = “C:\Sample\”」でファイル名をなくしてフォルダ名を指定します。
最後にファイル名と結合するために末尾に「¥」を付けています。
「Set MyFolder = FSO.GetFolder(FolderPath)」でフォルダを取得します。
「For Each MyFile In MyFolder.Files」で取得したフォルダをループしてファイルを取得しています。
「MyFolder.Files」で指定したフォルダ内のファイルコレクションをループします。
あとはそれぞれの日時を取得するプロパティで日時を取得しています。