VBAで作成日時や更新日時の最も新しいファイルを取得する方法についてご説明します。
取得した後の処理として、取得したファイルを開く方法と実行したファイルに読み込む方法についてもご説明したいと思います。
また、作成日時、更新日時、アクセス日時の違いについても簡単にですが、併せて説明したいと思います。
その他のファイル数の取得や、作成日時などの取得方法については下記記事をご覧ください。
- 指定したフォルダ内のファイル数を取得する方法
- ファイルの作成日時、更新日時、アクセス日時の取得方法
- FileSystemObjectでファイル数を取得する方法
- FileDateTime関数の使い方とファイルの日時取得
1.作成日時、更新日時の取得方法
作成日時、更新日時の取得方法についてご説明します。
取得するには「FileDateTime関数」を使用します。
詳細については「FileDateTime関数の使い方とファイルの日時取得」をご覧ください。
ファイルには作成、更新、アクセスの3つの日時があり、それぞれの違いについて簡単に説明します。
作成日時、更新日時、アクセス日時の違い
この日時の違いとそれぞれの日時がどのタイミングで更新されるかについてです。
日時が作成される
日時 | 説明 |
作成日時 | そのファイルがその場所に作成もしくはコピーされた日時 |
更新日時 | そのファイルが保存などで更新された日時 |
アクセス日時 | そのファイルにプログラムなどでアクセスした日時 |
作成日時と更新日時の前後が逆で、更新日時の方が古いという現象をよく見ます。
これは作成日時がファイルをコピーして作成した際に新しくなることにあります。
作成日時、更新日時の取得方法
「FileDateTime関数」は指定したファイルの作成日時または最終更新日時を取得します。
次のように記述します。
FileDateTime(PathName)
引数PathNameには日時を取得したいファイル名の文字列式を指定します。
フォルダのパスを指定する事もでき、省略するとカレントフォルダ内が指定されたことになります。
現在のカレントフォルダを調べるのも手間になるので、フォルダも指定するか意図的にカレントフォルダを指定する事をおすすめします。
また、ファイル名にワイルドカードを指定する事が出来ないため、一度に複数のファイルを指定する事が出来ません。
指定したファイルが存在しない場合はエラーとなるため、ファイルの存在を確認してから取得する事でエラーを回避できます。
2.ファイルの最新の日時を取得するコード
指定したフォルダ内の最新のファイルの取得するサンプルコードです。
指定したフォルダ内をループして、取得した日時を比較して最も新しいファイルを指定して取得します。
取得後にそのファイルを開いたり、読み込んだり何かしらの処理を行う事を想定して「開く」、「読み込む」の2パターンのコードを紹介したいと思います。
今回はCドライブにSampleというフォルダを作成し、その中に「Test01.xlsx」~ 「Test04.xlsx」 というファイルを作成しましたので、そのファイルの最も新しい日時の「Test01.xlsx」を取得したいと思います。
最新のファイルを開くコード
ファイルを開く方法の詳細については「ファイル名を指定してファイルを開く」をご覧ください。
エラー処理なども記載されています。
Sub Sample1()
Dim FileTime As Date
Dim MaxTime As Date
Dim FileName As String
Dim MaxFileName As String
With CreateObject("WScript.Shell") 'カレントフォルダを指定
.CurrentDirectory = "C:\Sample\"
End With
FileName = Dir("*.xlsx") 'ワイルドカードで拡張子「xlsx」ファイルを取得
Do While FileName <> "" 'ファイルを取得出来なくなるまでループ
FileTime = FileDateTime(FileName) '取得したファイルの日時を取得
If FileTime > MaxTime Then '時間を比較
MaxTime = FileTime '日付が大きい場合は格納
MaxFileName = FileName '日付が大きい場合はファイル名を格納
End If
FileName = Dir()
Loop
Workbooks.Open MaxFileName '最終的に最新日時のファイルを開く
End Sub
コードの説明
基本的にはコメントに説明を記載していますので、簡単に説明します。
「With CreateObject(“WScript.Shell”)」~「End With」でカレントフォルダを指定しています。
「FileName = Dir(“*.xlsx”)」でワイルドカードを使用して、拡張子「xlsx」ファイルをすべて取得するように指定します。
「Do While FileName <> “”」でファイル名を取得出来なくなるまでループします。
ループ内の処理で「FileTime = FileDateTime(FileName)」で取得したファイルの日時を取得します。
「If FileTime > MaxTime Then」取得した日時を比較してすでに格納済みの日時より大きい場合は、新たに取得した日時を格納しなおします。
「MaxFileName = FileName」でファイル名も開く際に必要になるため、ファイル名も格納しなおします。
「Workbooks.Open MaxFileName」ですべてのファイルをループして日時を判定後、最終的に一番新しい日時のファイルを開きます。
最新のファイルを読み込むコード
上記コードの最後を少し工夫して、開くのではなく実行したファイルにシートを読み込むコードです。
ファイルを読み込む方法の詳細については「指定したファイルを読み込む」をご覧ください。
Sub Sample2()
Dim FileTime As Date
Dim MaxTime As Date
Dim FileName As String
Dim MaxFileName As String
Dim ShCount As Long
With CreateObject("WScript.Shell") 'カレントフォルダを指定
.CurrentDirectory = "C:\Sample\"
End With
FileName = Dir("*.xlsx") 'ワイルドカードで拡張子「xlsx」ファイルを取得
Do While FileName <> "" 'ファイルを取得出来なくなるまでループ
FileTime = FileDateTime(FileName) '取得したファイルの日時を取得
If FileTime > MaxTime Then '時間を比較
MaxTime = FileTime '日付が大きい場合は格納
MaxFileName = FileName '日付が大きい場合はファイル名を格納
End If
FileName = Dir()
Loop
ShCount = ThisWorkbook.Worksheets.Count '実行したファイルのシート数を取得
Workbooks.Open MaxFileName
Worksheets(1).Copy after:=ThisWorkbook.Worksheets(ShCount) 'シートの1つ目を指定して末尾に追加
Workbooks(MaxFileName).Close savechanges:=False '取得したファイルを閉じる
End Sub
コードの説明
前半部分は同じです。
最後のファイルを読み込む部分について簡単に説明します。
「ShCount = ThisWorkbook.Worksheets.Count」で実行したファイルのシート数を取得してます。
「Workbooks.Open MaxFileName」で取得した最新の日時のファイルを開きます。
「Worksheets(1).Copy after:=ThisWorkbook.Worksheets(ShCount)」でシートの1つ目を指定して末尾に追加します。
このとき「Worksheets.Copy」と番号を省略した場合は、すべてのシートをまとめて読み込みます。
「Workbooks(FileName).Close savechanges:=False」で最後に取得したファイルを保存しないで閉じます。