⚡
AutoBackupOnClose
自動化ブックを閉じる前にバックアップを作成するイベントハンドラです
ブックを閉じる直前に自動的に現在のファイルをバックアップとして別名で保存するマクロです。バックアップファイル名にはタイムスタンプが自動付与されるため、複数世代のバックアップが蓄積されます。うっかり保存してしまったり、誤ってデータを消したりした場合でも、直前のバックアップから復元できます。このマクロを一度設定すれば、以降は何も意識せずにバックアップが自動作成されます。大切なファイルのデータ損失リスクを大幅に低減できます。内部ではThisWorkbookモジュールのWorkbook_BeforeCloseイベントにコードを記述し、FileCopyステートメントで別名保存を行っています。AutoSaveBackupが一定間隔での定期保存であるのに対し、本マクロは「閉じる瞬間」に確実に1回保存する点が異なり、両方を併用するとより安全性が高まります。

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: ThisWorkbook モジュールの BeforeClose イベントから AutoBackupOnClose を呼び出します
🎯 活用シーン
- ✓重要な売上データや財務データを含むブックを閉じるたびに自動バックアップして、データ損失のリスクをゼロにしたいとき
- ✓複数人が共有するファイルで誰かが誤った保存をした場合でも、直前のバックアップから復元できる仕組みを作りたいとき
- ✓定期的にバックアップを手動で取る作業を忘れがちな担当者のために、自動バックアップの仕組みを導入したいとき
- ✓終業時に必ずファイルを閉じる運用のチームで、閉じるたびに確実な最新バックアップを残したいとき
- ✓AutoSaveBackupの定期保存に加えて、作業終了時の最終状態も別途保存しておきたいとき
💡 実装のヒント
- ▸バックアップの保存先フォルダを事前にマクロに設定しておいてください。デフォルトでは元ファイルと同じフォルダに保存されます。
- ▸バックアップが蓄積しすぎる場合は、一定期間より古いファイルを自動削除する処理を追加することをお勧めします。
- ▸OnBeforeCloseイベントに登録するため、マクロをThisWorkbookオブジェクトに記述してください。標準モジュールへの記述では自動実行されません。
- ▸バックアップファイル名にFormat(Now, "yyyymmdd_hhnnss")を組み込むと、秒単位で世代管理ができ上書き事故を防げます。
- ▸共有ドライブへの保存は書き込み権限やネットワーク切断時の失敗を考慮し、ローカル併用も検討してください。
💻 VBAコード
' AutoBackupOnClose
' -----------------
' Macro Name: AutoBackupOnClose
' Description: ブックを閉じる前にバックアップを作成するイベントハンドラです
' Parameters: なし
' Returns: なし
' Usage: ThisWorkbook モジュールの BeforeClose イベントから AutoBackupOnClose を呼び出します
' -----------------
Sub AutoBackupOnClose()
On Error GoTo ErrorHandler
Dim wb As Workbook
Dim backupPath As String
Dim fileName As String
Dim timestamp As String
Set wb = ActiveWorkbook
If wb.Path = "" Then
MsgBox "先にブックを保存してください", vbExclamation, "注意"
Exit Sub
End If
timestamp = Format(Now, "yyyymmdd_hhmmss")
fileName = Left(wb.Name, InStrRev(wb.Name, ".") - 1)
backupPath = wb.Path & "\" & fileName & "_backup_" & timestamp & ".xlsm"
wb.SaveCopyAs backupPath
MsgBox "バックアップを作成しました:" & vbCrLf & backupPath, vbInformation, "バックアップ完了"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical, "エラー"
End Sub