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技術解説
・メタ文字 ・正規表現 ・正規表現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 ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


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