VBAで最近更新されたファイルだけを自動で開く方法 | 日数・拡張子・最新1件の絞り込み

VBAでフォルダ内の「最近更新されたファイルだけを開く」には、FileSystemObjectの DateLastModified プロパティで各ファイルの最終更新日時を取得し、日数条件と比較するだけで実現できます。日々増え続けるファイルの中から、前回作業したものだけをサッと開く処理に活用できます。

この記事では、次の内容を順番に解説します。

  • 更新日時をもとに最近のファイルだけを開く基本コード
  • 日数条件・拡張子・ファイル名の絞り込みパターン
  • 最終更新日時が最も新しい1ファイルだけを開く方法
  • 開いたファイルをシートに一覧記録する応用パターン

更新日時をチェックして最近のファイルを開くには?

FileSystemObjectの DateLastModified プロパティでファイルの最終更新日時を取得し、「現在日時から3日前」などの基準日と比較します。基準日以降に更新されたファイルだけを Workbooks.Open で開く、というのが基本の流れです。

Sub OpenRecentFiles()

    Dim fso      As Object
    Dim folder   As Object
    Dim file     As Object
    Dim path     As String
    Dim dtLimit  As Date

    'ダイアログでフォルダを選択
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then Exit Sub
        path = .SelectedItems(1) & "¥"
    End With

    Set fso    = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)

    '3日以内に更新されたファイルのみ対象
    dtLimit = Now - 3

    For Each file In folder.Files
        If file.DateLastModified >= dtLimit Then
            Workbooks.Open file.Path
        End If
    Next file

End Sub

DateLastModified はファイルを上書き保存したときに更新される日時です。Now - 3 で「現時点から3日前」の日時を計算し、それより新しいファイルだけを開きます。

プロパティ・書き方内容
file.DateLastModifiedファイルの最終更新日時2026/04/14 09:23:00
Now - 3現在から3日前の日時2026/04/13 → 2026/04/10
Date今日の日付(0時0分0秒)当日更新分だけに絞りたい場合に使う

拡張子やファイル名でさらに絞り込むには?

フォルダにExcel以外のファイルも混在している場合は、拡張子やファイル名の条件を追加して絞り込みます。Right 関数で拡張子を確認するか、InStr 関数でファイル名に特定の文字列が含まれるかチェックします。

Sub OpenRecentExcelFiles()

    Dim fso      As Object
    Dim folder   As Object
    Dim file     As Object
    Dim path     As String
    Dim dtLimit  As Date
    Dim ext      As String

    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then Exit Sub
        path = .SelectedItems(1) & "¥"
    End With

    Set fso    = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)

    dtLimit = Now - 7   '7日以内に更新されたファイルが対象

    For Each file In folder.Files
        ext = LCase(fso.GetExtensionName(file.Name))

        '拡張子がxlsxまたはxlsmのファイルのみ対象
        If (ext = "xlsx" Or ext = "xlsm") And _
           file.DateLastModified >= dtLimit Then
            Workbooks.Open file.Path
        End If
    Next file

End Sub

ファイル名に特定のキーワードが含まれるものだけに絞りたい場合は、InStr を使います。

'「売上」という文字を含むファイルだけに絞る例
If InStr(file.Name, "売上") > 0 And file.DateLastModified >= dtLimit Then
    Workbooks.Open file.Path
End If

最も新しい1ファイルだけを開くには?

「最近のファイルを全部開く」ではなく、「最終更新日時が一番新しい1ファイルだけを開く」場合は、ループで最新日時を更新しながら対象ファイルを絞り込みます。

Sub OpenLatestFile()

    Dim fso        As Object
    Dim folder     As Object
    Dim file       As Object
    Dim path       As String
    Dim latestFile As Object
    Dim latestDate As Date

    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then Exit Sub
        path = .SelectedItems(1) & "¥"
    End With

    Set fso    = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)

    latestDate = 0   '初期値は最古の日時

    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = "xlsx" Then
            If file.DateLastModified > latestDate Then
                latestDate = file.DateLastModified
                Set latestFile = file
            End If
        End If
    Next file

    '最新ファイルが見つかった場合だけ開く
    If Not latestFile Is Nothing Then
        Workbooks.Open latestFile.Path
        MsgBox "最新ファイルを開きました:" & latestFile.Name
    Else
        MsgBox "対象ファイルが見つかりませんでした。"
    End If

End Sub

開いたファイルをシートに一覧記録するには?

どのファイルを開いたかをシートに記録しておくと、後から確認しやすくなります。ファイル名・パス・更新日時をセットで書き出す例です。

Sub OpenAndLogRecentFiles()

    Dim fso      As Object
    Dim folder   As Object
    Dim file     As Object
    Dim path     As String
    Dim dtLimit  As Date
    Dim ws       As Worksheet
    Dim row      As Integer

    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> -1 Then Exit Sub
        path = .SelectedItems(1) & "¥"
    End With

    Set fso    = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(path)
    Set ws     = ThisWorkbook.Sheets("ログ")

    dtLimit = Now - 3
    row = 2

    '見出し行を書き込む
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "パス"
    ws.Cells(1, 3).Value = "最終更新日時"

    For Each file In folder.Files
        If file.DateLastModified >= dtLimit Then
            Workbooks.Open file.Path
            ws.Cells(row, 1).Value = file.Name
            ws.Cells(row, 2).Value = file.Path
            ws.Cells(row, 3).Value = file.DateLastModified
            row = row + 1
        End If
    Next file

    MsgBox row - 2 & " 件のファイルを開きました。"

End Sub

まとめ

  • DateLastModified でファイルの最終更新日時を取得し、Now - 日数 と比較するのが基本
  • 当日分のみに絞りたい場合は dtLimit = Date7日以内なら dtLimit = Now - 7 に変えるだけ
  • GetExtensionName で拡張子を確認すると、Excelファイルだけに絞り込める
  • InStr でファイル名にキーワードが含まれるかチェックすれば、用途別の絞り込みにも対応できる
  • 最新の1ファイルだけ開きたい場合は、ループで 最大日時を更新しながら対象を絞る 方法を使う

よくある質問

DateLastModified と DateCreated の違いは何ですか?

DateLastModified はファイルを最後に上書き保存した日時、DateCreated はファイルを最初に作成した日時です。「最近使ったファイル」を対象にする場合は DateLastModified を使います。ファイルをコピーした場合、DateCreated はコピー日時に更新されますが、DateLastModified は元の更新日時が引き継がれることがあります。

サブフォルダの中のファイルも対象にできますか?

できます。FSOの folder.SubFolders を使ってサブフォルダを再帰的に処理する関数を作れば対応できます。ただしファイル数が多い場合は処理時間がかかるため、対象フォルダの範囲は必要最小限に絞ることをおすすめします。

一度に大量のファイルが開いてしまいます。上限を設けることはできますか?

できます。カウンター変数を用意して、開いたファイル数が上限に達したら Exit For でループを抜けるようにします。たとえば If openCount >= 5 Then Exit For のように記述することで、最大5ファイルまでに制限できます。

ファイルダイアログを使わずにパスを直接指定できますか?

できます。path = "C:¥Data¥作業フォルダ¥" のようにパスを直接変数に代入すればダイアログは不要です。毎回同じフォルダを対象にする場合はパスを固定した方が手間が省けます。

開いたファイルを確認せずに自動処理するのが不安です

まずは Workbooks.OpenMsgBox file.Name に置き換えて、対象ファイルの一覧だけを表示するテスト実行をおすすめします。開く前に「このファイルを開きますか?」という確認ダイアログを入れる場合は、MsgBoxvbYesNo を組み合わせて、「はい」を選んだときだけ開く処理にするとより安全です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール