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
今回も非常に勉強になりましタンタンメン!!
ありがとうございました。
そして最後までご視聴ありがとうございました。
コメント