フォルダ内、更新日時の一番新しいファイルを取得したい
ユーザーが操作したファイルや、マクロで作成したファイルで最も新しいファイルを取得したい場合があります。
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で作成したファイルですかね。