AccessのVBAでフォルダー内ハウスキープ(古いファイルを自動削除)関数


ハウスキープってなんぞ?

  • ログファイル
  • バックアップとして自動で出力したPDFやCSVファイル

なんかがずーっと貯まり続けてストレージを圧迫しないように、古いやつを消す処理のこと。

参照設定

この記事の例は FileSystemObject クラスを使うので、VBEの参照設定で Microsoft Scripting Runtime にチェックを入れる必要があります。

指定フォルダー内の古いファイルは全て削除、サブフォルダーは即滅殺関数

『フォルダーパス』と『ファイルは何日間保存するか』を引数としてもらいます。

Public Function file_housekeep(ByVal folder_path As String, ByVal save_days As Long)

    Dim fso_ As New FileSystemObject
    Dim file_ As file

    For Each file_ In fso_.GetFolder(folder_path).Files

        If file_.DateCreated < DateAdd("d", -1 * save_days, Now()) Then
            fso_.DeleteFile (file_.Path)
        End If

    Next

    Dim folder_ As Folder
    For Each folder_ In fso_.GetFolder(folder_path).SubFolders
        fso_.DeleteFolder (folder_.Path)
    Next

End Function
  • 拡張子は考慮しません。
  • サブフォルダーはイレギュラーとし、作成日に寄らず即削除します。(サブフォルダー内にさらにサブフォルダーやファイルがある場合は再帰的に削除されます)
  • 削除判定の閾値はそこまで厳密にしていません。(コードの読みやすさ優先)

蛇足

『指定拡張子のみ削除』『サブフォルダー内のファイルについても再帰的に作成日をチェックして…』
などなど、細かく指定しようと思えばいくらでもできるけど、引数が多くなるし処理も複雑になってコードを理解するのに時間がかかるん…

CSVならCSV用のフォルダに出力!ログならログのフォルダに出力!
そして、出力フォルダ内のファイルはとにかく一定期間過ぎたら消える!
…というように 仕様はできる限りシンプルに した方がいいと思います。
(サブフォルダーを即削除するかはちょっと迷うところです)

バージョン

Windows10 Pro バージョン1909 OSビルド19042.630
Access for Microsoft 365 MSO(16.0.13328.20334)32ビット