Excelファイルを編集した後、保存を忘れて閉じてしまうことは意外とよくあります。特にマクロ付きブック(.xlsm)では、上書き保存だけでは履歴が残らず不安になることもあります。
この記事では、ファイルを閉じるタイミングで自動的に別名バックアップを作成する方法を解説します。Workbook_BeforeClose イベントと SaveCopyAs を使って実現します。
ファイルを閉じるときに自動で別名保存するには?
次のコードを ThisWorkbook モジュールに記述します(標準モジュールではなく ThisWorkbook に書くことが重要です)。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim path As String
Dim fileName As String
Dim timeStamp As String
' 日時の文字列を作成(例:20250717_1930)
timeStamp = Format(Now, "yyyymmdd_hhmm")
' 元のブックと同じフォルダに保存先を設定
path = ThisWorkbook.Path & "¥"
fileName = "Backup_" & timeStamp & ".xlsm"
' 別名で保存(元ファイルは変更されない)
ThisWorkbook.SaveCopyAs path & fileName
End Sub
このコードを書く手順は次のとおりです。
① Alt + F11 でVBEを開く
② 左側のプロジェクトツリーから ThisWorkbook をダブルクリック
③ 上記コードを貼り付けて保存
ファイルを閉じるたびに Backup_20250717_1930.xlsm のような名前でバックアップが自動作成されます。元ファイルはそのまま残ります。
コードのポイントを理解するには?
Workbook_BeforeClose
ブックを閉じる直前に自動で実行されるイベントプロシージャです。このイベント内に書いた処理は、ユーザーが閉じるボタンを押したタイミングで動きます。
Format(Now, "yyyymmdd_hhmm")
現在の日時を「20250717_1930」のような文字列に変換します。ファイル名に付けることで保存のたびに別ファイルになり、履歴として残せます。
ThisWorkbook.SaveCopyAs
元のブックを上書きせずに、指定したパスに別名でコピーを保存します。元ファイルの内容は変わりません。
保存先フォルダを変えるには?
同じフォルダ内ではなく、専用のバックアップフォルダに保存したい場合はパスを変更します。
' バックアップ専用フォルダに保存する例
path = ThisWorkbook.Path & "¥Backup¥"
ただしフォルダが存在しないとエラーになるため、事前にフォルダを作成するか、MkDir で自動作成する処理を追加してください。
まとめ
Workbook_BeforeCloseはブックを閉じる直前に自動実行されるイベントSaveCopyAsで元ファイルを変更せずに別名コピーを保存できるFormat(Now, "yyyymmdd_hhmm")でタイムスタンプ付きのファイル名を生成できる- コードは ThisWorkbook モジュールに書く(標準モジュールではない)
- 保存先やファイル名の形式は自由にカスタマイズできる
よくある質問
このコードを書いてもイベントが発動しない場合はどうすればいいですか?
標準モジュールではなく ThisWorkbook モジュールに書いてあるかを確認してください。また、マクロが無効になっている場合は「開発」タブでマクロを有効にしてください。
バックアップが増えすぎた場合はどう管理しますか?
定期的に古いファイルを削除するか、ファイル名の日付形式を「yyyymmdd」だけにして同日分を上書きする設計にすると管理しやすくなります。
SaveCopyAsとSaveAsの違いは何ですか?
SaveCopyAs は現在のブックを別名でコピーするだけで、元ブックの名前や場所は変わりません。SaveAs は元ブック自体を別名で保存し直すため、以降は新しい名前のファイルとして扱われます。バックアップには SaveCopyAs が適しています。
バックアップフォルダが存在しない場合に自動作成できますか?
できます。If Dir(path, vbDirectory) = "" Then MkDir path という1行を SaveCopyAs の前に追加することでフォルダがない場合に自動作成されます。
閉じるときに確認ダイアログを出してからバックアップを取ることはできますか?
できます。Workbook_BeforeClose 内でMsgBoxを使って「バックアップを保存しますか?」と確認し、「はい」の場合だけ SaveCopyAs を実行する分岐を入れることができます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



