VBA練習問題
VBA100本ノック 21本目:バックアップファイルの削除

VBAを100本の練習問題で鍛えます
公開日:2020-11-10 最終更新日:2021-01-13

VBA100本ノック 21本目:バックアップファイルの削除


開いているブックの古いバックアップファイルを削除する問題です。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータはご自身でご用意ください。


出題

出題ツイートへのリンク

#VBA100本ノック 21本目
自身(ThisWorkbook)と同じフォルダに"BACKUP"フォルダがあります。
このフォルダ内に自身のバックアップが以下の名称で多数入っています。
ブック名_yyyymmddhhmm.xlsm
実行日を含め30日分だけ残し、古いファイルは削除してください。
※日付はファイル名で判断


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

フォルダ内のファイル一覧を取得するには、Dir関数またはFileSystemObjectのどちらかになるでしょう。
まずはDir関数をDo…Loopで順次処理するVBAは覚えておいた方が良いでしょう。
フォルダに関係ないファイルを間違って入れてしまっている場合もあるので、ブック名のチェックはしたいですね。

Sub VBA100_21_01()
  Dim wb As Workbook
  Dim delLastDay As String
  Set wb = ThisWorkbook
  delLastDay = Format(Date - 30, "yyyymmdd")
  
  Dim sPath As String
  Dim sFile As String
  Dim sExt As String
  sPath = wb.Path & "\BACKUP"
  If Dir(sPath, vbDirectory) = "" Then Exit Sub
  sExt = Mid(wb.Name, InStrRev(wb.Name, ".") + 1)
  sFile = Left(wb.Name, InStrRev(wb.Name, ".") - 1)
  
  Dim tFile As String
  tFile = Dir(sPath & "\" & sFile & "_*." & sExt)
  Do Until tFile = ""
    If tFile Like sFile & "_############." & sExt Then
      If Mid(tFile, InStrRev(tFile, "_") + 1, 8) <= delLastDay Then
        On Error Resume Next
        Kill sPath & "\" & tFile
      End If
    End If
    tFile = Dir()
  Loop
End Sub

Killは読み取り専用は削除できないのでエラー対応を入れました。
FSOは読み取り専用も削除できますが、それでも削除できない場合もあります。
(ファイルを開いている等)
DirをFSOに書き換えたコードは記事補足に掲載しました。
※掲載VBAは少々テスト不足かもしれません。


補足

VBAは少々ごちゃごちゃしていますが、多くは文字列操作しているだけで、
基本は、
  tFile = Dir(パス)
  Do Until tFile = ""
    ・・・
    tFile = Dir()
  Loop
この構造だけしっかり把握していれば問題ないでしょう。

Dir関数+KillステートメントをFileSystemObjectに書き換えたものが以下になります。
Do...LoopがFor Each...Nextになっているだけで、基本構造は同じですね。

※「Microsoft Scripting Runtime」を参照設定しています。
Sub VBA100_21_02()
  Dim wb As Workbook
  Dim delLastDay As String
  Set wb = ThisWorkbook
  delLastDay = Format(Date - 30, "yyyymmdd")
  
  Dim sPath As String
  Dim sFile As String
  Dim sExt As String
  Dim fso As Scripting.FileSystemObject
  Set fso = CreateObject("Scripting.FileSystemObject")
  sPath = wb.Path & "\BACKUP"
  If Not fso.FolderExists(sPath) Then Exit Sub
  sExt = fso.GetExtensionName(wb.Name)
  sFile = fso.GetBaseName(wb.Name)
  
  Dim tFile As File
  For Each tFile In fso.GetFolder(sPath).files
    If tFile.Name Like sFile & "_############." & sExt Then
      If Mid(tFile.Name, InStrRev(tFile.Name, "_") + 1, 8) <= delLastDay Then
        On Error Resume Next
        tFile.Delete Force:=True
      End If
    End If
  Next
  Set fso = Nothing
End Sub

文字列処理部分は、正規表現で処理する方法も考えられそうですが、
今回はかえってコードが長くなりそうなのでサンプルは書きませんでした。


サイト内関連ページ

第79回.ファイル操作Ⅰ(Dir)|VBA入門
・Dir関数 ・Dir関数の使用例 ・Dir関数の実践例 ・Dir関数の制限について ・Dir関数の関連記事
第80回.ファイル操作Ⅰ(その他)|VBA入門
・ファイル操作で使う、ステートメントと関数 ・ファイル操作の使用例 ・ファイル操作の実践例 ・ファイル操作について
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例
DIR関数で全サブフォルダの全ファイルを取得|VBAサンプル
・Dir関数でサブフォルダも含むファイル一覧を取得するVBA ・ファイル一覧を取得するVBAの使用例と解説 ・Dir関数の関連記事
Dir関数の制限について|VBA技術解説
・3桁拡張子の指定時の問題 ・256バイトを超えるパス名が扱えない ・UNICODEファイル名が扱えない ・特殊なネットワークドライブでエラー ・Dir関数の制限の最後に
VBAで正規表現を利用する(RegExp)|VBA技術解説
・VBScript 廃止に向けて、VBA プロジェクトを対応させる方法 ・メタ文字 ・正規表現 ・正規表現RegExpの使い方 ・RegExpオブジェクト ・RegExpの使用例 ・RegExp関連のオブジェクト ・Execute(Matches,Match,SubMatches)の使用例 ・Replaceの使用例 ・先読み:肯定先読み、否定先読み ・正規表現の実践例




同じテーマ「VBA100本ノック」の記事

18本目:名前定義の削除
19本目:図形のコピー
20本目:ブックのバックアップ
21本目:バックアップファイルの削除
22本目:FizzBuzz発展問題
23本目:シート構成の一致確認
24本目:全角英数のみ半角
25本目:マトリックス表をDB形式に変換
26本目:ファイル一覧作成
27本目:ハイパーリンクのURL
28本目:シートをブックに分割


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ