84本目 ブックを自動でバックアップ

VBA100本ノック

VBA100本ノック 84本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

ブックが保存される時に、
自動的にバックアップを作成してください。
Thisworkbookパスの下の、”BACKUP”フォルダに作成。
最新の30世代だけを残し、
それより古いバックアップは削除してください。
※ブック名_yymmddhhmmss.xlsm
※当該ファイル以外は存在しません。
※イベントは、BeforeSave、
AfterSave、どちらでも構いません。

再度訂正です。
要件としては、万一のためのバックアップを30世代確保することです。

解答

Private Sub a(ByVal Success As Boolean)    
    Call ノック84本目
End Sub

Sub ノック84本目()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = Sheets("Sheet1")
    ws.Range("A1").CurrentRegion: r.Offset(1).ClearContents ' 元データ削除
    Dim fso As New Scripting.FileSystemObject
    Dim fol_name As String: fol_name = wb.Path & "\BACKUP"
'フォルダ作成
    If Not fso.FolderExists(fol_name) Then
        fso.CreateFolder (fol_name)
    End If
'日付を付けて保存
    Dim save_name As String: save_name = Replace(wb.Name, ".xlsm", _
                                                        Format(Now(), "yyyymmddhhmmss")) & ".xlsm"
    wb.SaveCopyAs fol_name & "\" & save_name
'ファイル名と更新日時を出力
    Dim f As File, i As Long: i = 2
    For Each f In fso.GetFolder(fol_name).Files
        ws.Cells(i, 1) = f.Name
        ws.Cells(i, 2) = f.DateLastModified
        i = i + 1
    Next
'降順に並び替えて32行目以降のファイルを削除
    ws.Range("A1").CurrentRegion.Sort Range("B1"), xlDescending, , , , , , xlYes 'B列を降順で並び替え
    If ws.Range("A1").CurrentRegion.Rows.Count >= 32 Then
        For i = 32 To ws.Range("A1").CurrentRegion.Rows.Count
            Kill fol_name & "\" & ws.Cells(i, 1).Value
        Next i
    End If
End Sub


今回はWorkbook_AfterSaveイベントを使ってみました。
(Workbook_BeforeSaveでも解答可)。


もし同じような問題があったら次はBeforeSaveを使おう!と思ってたら
100本ノックではこれが最後でした。w

実務で試してみようw

新人君
新人君

今回やりたいことは
どっちでも実現できそうですね!!

ブチョ
ブチョ

どっちかというと俺は
BeforeSaveのほうが
好みだなぁ…

新人君
新人君

違いわかってんのか?

Workbook.AfterSave イベント

ブックを保存した後に発生するイベント。

保存に失敗した場合はSUCCESSがFALSEになる。

wb.Openやws.Change系と比較すると実務で使うことは少なそう?
他のイベントの使い方を知ってたら問題はなさそうですね。

ブチョ
ブチョ

俺はこのイベントを
一番使うけどね!

新人君
新人君

そうなんですね!

BACKUPフォルダ作成(FileSystemObject)

これまでに10回くらいは出てきた内容?w

前回はDir関数を使ってフォルダを作成しましたが、結局こっちに戻ってきましたw
使い方に不明点がある人は20本目の動画をご覧ください。

バックアップ作成(Workbook.SaveCopyAs メソッド)

“バックアップ作成”と言っても、やることは名前を付けて保存。
Workbook.SaveCopyAs メソッドさんを使えば、ThisWorkbookのNameを変更できずに保存できるので超便利ですね。

SaveCopyAs メソッドさんを使えば超簡単にコピー保存ができちゃうので、
あとは「どうやって現在時刻が入ったブック名を求めるか」がわかればOKですね。

今回は「Save_Name」って変数に、
現在時刻の入ったブックの名前を格納して使いました。

一つずつゆっくり考えたらできそうですね。
こちらも20本目参照です(´ω`)

○○世代以前のバックアップは削除する

無限に増えるとウザいので…w
ちゃんと削除するところまでを問題に入れてくれてる神髄さんの優しさ。

やり方はたぶん色々あったと思うんですが、
折角Excelを使ってるんだから…シートを使わないとモッタイナイ!ってのがuぷ主の考え方。

①BACKUPフォルダ内の情報をシートへ書き出す(A列:ブック名 B列:更新時刻)
➁更新時刻の新しい順に並び替え(B列を降順)
③30ファイル分以上あった場合(動画では最終行~32行目までをループ)、そのファイルを削除。

消したファイル名とか、更新日時とかの情報も
どこかに保存してあげたほうが親切だったりしたのかな?

あとがたり

おはこんばんちは。uぷ主です。
84本目、ブックのパックアップを作成する問題でした。

ムズイ!ムズすぎる!
30世代以前のファイルを削除する部分!

ここ、超絶悩みました…。

配列にぶち込んでsmall関数でやるのが一番簡単だったのかな~と今なら思ったりします。

ただ…そんな発想はなかった…w
難しっ!

ただ…それ以外は比較的簡単でした。
というか…今までに何回やってきてん!って感じでしたね。
流石84本目!
伊達にに83本やってきてないですね…w

今回も非常に勉強になりましタンタンメン!!
ありがとうございました。

そして最後までご視聴ありがとうございました。

コメント

タイトルとURLをコピーしました