VBATips

フォルダ内、更新日時の一番新しいファイルを取得する【FileDateTime】【ExcelVBA】

フォルダ内、更新日時の一番新しいファイルを取得したい

ユーザーが操作したファイルや、マクロで作成したファイルで最も新しいファイルを取得したい場合があります。
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

注意点

関連記事

コメント

  1. 11行目の下記コードはchkNameが””のときに例外を発生します。

    maxTime = FileDateTime(sPath & chkName)

    ファイルが存在しない場合の考慮が必要かと思います。

    • ご認識の通りです!IF関数等で比較が本来必要ですね。
      シンプルな部分のコード公開のみで、あくまでも概要を掴むコードになっておりますので、ご了承くださいませ。

  2. こんにちは、とっても読みやすいコードで、コメントのつけ方・プロシージャの分割の仕方等、参考になりました!
    ひとつだけ詰まったところがあったので、コメントを残しておきます。
    10行目でDir関数でファイルの取得すると、ファイル名に含まれる濁音が、静音+濁点にわかれてしまって、14行目でエラーが出てしまいました。(例:バ→ハ゛、ご→こ゛)
    環境:Windows10+Microsoft365のエクセル(64bit、バージョン2301)
    Dir関数だと、長いパスやファイル名でもエラーが出てしまうので、私はFileSystemObjectを使うように直してみようと思います。

    • そうですね、Dir関数はさらっと使えるのですが、FSOの方が汎用性はありますよね。私も結構使い分けます。
      今回のファイル名が別れてしまう原因はMacで作成したファイルですかね。

タイトルとURLをコピーしました