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

VBAを100本の練習問題で鍛えます
最終更新日: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入門
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。引数に指定したファイルが存在すると、そのファイル名を返し存在しないと空欄を返します。
第80回.ファイル操作Ⅰ(その他)|VBA入門
VBAではファイル操作するためのステートメントと関数が多数用意されています、マクロVBAでファイル操作する場合は、これらの用意されたステートメントや関数を使い処理を実現します。ファイル操作で使う、ステートメントと関数 ChDriveステートメント ChDirステートメント CurDir関数 MkDirステートメント…
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし機能が大変多いため、これらを全て覚えるという事は困難です。
DIR関数で全サブフォルダの全ファイルを取得|VBAサンプル
指定フォルダ以下の全サブフォルダ内の全ファイルを取得する場合、通常はFileSystemObjectの再帰モジュールで実現しますが、これをDir関数だけで、かつ、再帰ではなく二重ループで実現しています。FileSystemObjectの再帰プロシージャーについては、エクセルでファイル一覧を作成 こちらをご覧ください。
Dir関数の制限について|VBA技術解説
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。
VBAで正規表現を利用する(RegExp)|VBA技術解説
正規表現は複雑なパターンマッチングとテキストの検索置換するためのツールです、マクロVBAで正規表現を使う場合はRegExpオブジェクトを使用します、RegExpは、VBScriptに正規表現として用意されているオブジェクトです。目次 メタ文字 正規表現 正規表現RegExpの使い方 RegExpオブジェクト Reg…




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

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


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

VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)
エクセルVBA 段級位 目安|エクセル雑感(2021-06-21)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門




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


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



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