フォルダ内、更新日時の一番新しいファイルを取得したい
ユーザーが操作したファイルや、マクロで作成したファイルで最も新しいファイルを取得したい場合があります。
FileSystemObjectでも取得は可能ですが、FileDateTime関数で紹介します。
フォルダ内、更新日時の一番新しいファイルを取得するサンプルコード
’■指定フォルダ内で一番新しいファイル(Latest)を取得する
Public Function Call_GetLatestFile(sPath As String, sExtension As String) As String
Dim chkTime As Date
Dim maxTime As Date
Dim chkName As String
Dim maxName As String
sPath = Call_TruePath(sPath) '★
chkName = Dir(sPath & sExtension)
maxTime = FileDateTime(sPath & chkName)
maxName = chkName
Do While chkName <> ""
chkTime = FileDateTime(sPath & chkName)
'■時間を比較し、既存より古ければ、ファイル名、ファイル更新時間を上書き
If chkTime > maxTime Then
maxTime = chkTime
maxName = chkName
End If
chkName = Dir()
Loop
Call_GetLatestFile = maxName 'ファイル名の場合
'Call_GetLatestFile = sPath & maxName 'フルパス(パス&ファイル名)の場合
End Function
使い方
実際の使い方は以下です。
Public Sub sample()
Dim sPath As String: sPath = "C:\vba"
Dim sFile As String
sFile = Call_GetLatestFile(sPath, "*") '全ての拡張子から一番古いファイルを取得
sFile = Call_GetLatestFile(sPath, "*.xls*") '.xlsを含むファイルから一番古いファイルを取得(.xls/.xlsx/.xlsm)
End Sub
注意点
- 上記コードのみでは動きません。下記のパーツ化された処理も追加してください。
※コメント★部分の処理は別処理で動きます。
・指定パスの末尾に円マーク(\)付与する



コメント
11行目の下記コードはchkNameが””のときに例外を発生します。
maxTime = FileDateTime(sPath & chkName)
ファイルが存在しない場合の考慮が必要かと思います。
ご認識の通りです!IF関数等で比較が本来必要ですね。
シンプルな部分のコード公開のみで、あくまでも概要を掴むコードになっておりますので、ご了承くださいませ。
こんにちは、とっても読みやすいコードで、コメントのつけ方・プロシージャの分割の仕方等、参考になりました!
ひとつだけ詰まったところがあったので、コメントを残しておきます。
10行目でDir関数でファイルの取得すると、ファイル名に含まれる濁音が、静音+濁点にわかれてしまって、14行目でエラーが出てしまいました。(例:バ→ハ゛、ご→こ゛)
環境:Windows10+Microsoft365のエクセル(64bit、バージョン2301)
Dir関数だと、長いパスやファイル名でもエラーが出てしまうので、私はFileSystemObjectを使うように直してみようと思います。
そうですね、Dir関数はさらっと使えるのですが、FSOの方が汎用性はありますよね。私も結構使い分けます。
今回のファイル名が別れてしまう原因はMacで作成したファイルですかね。