VBAで保存するたびに日付付きのバックアップファイルを自動作成するには、Workbook_BeforeSave イベントと SaveCopyAs を組み合わせます。これを設定しておくと、保存のたびに「ファイル名_20250601.xlsm」のようなバックアップが自動で残ります。
この記事では、次の内容を順番に解説します。
- 日付付きバックアップを自動作成する基本のコード
- 時間付きのファイル名にする応用
- 日付ごとにフォルダを分けて保存する応用
保存するたびにバックアップを自動作成するには?
次のコードをThisWorkbookモジュールに貼り付けると、ファイルを保存するたびに自動でバックアップが作成されます。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim backupFolder As String
Dim fileName As String
Dim backupName As String
' バックアップを保存するフォルダ(マクロファイルと同じ場所に「バックアップ」フォルダを作る)
backupFolder = ThisWorkbook.Path & "¥バックアップ¥"
' フォルダがなければ自動で作る
If Dir(backupFolder, vbDirectory) = "" Then
MkDir backupFolder
End If
' 拡張子を除いたファイル名を取得する
fileName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
' ファイル名に今日の日付をつける(例:Report_20250601.xlsm)
backupName = backupFolder & fileName & "_" & Format(Date, "yyyymmdd") & ".xlsm"
' 元のファイルはそのままで、コピーだけ保存する
ThisWorkbook.SaveCopyAs backupName
End Sub
コードの流れ
Workbook_BeforeSave:ファイルを保存する直前に自動で動くイベントです。ThisWorkbookモジュールに書きます。MkDir:指定したフォルダがなければ自動で作ります。InStrRev(ThisWorkbook.Name, "."):ファイル名の拡張子(.xlsm)の直前の位置を取得して、拡張子を取り除いたファイル名を作ります。Format(Date, "yyyymmdd"):今日の日付を「20250601」の形式に変換します。SaveCopyAs:今開いているファイルはそのままで、コピーだけ別名で保存します。
どこに貼り付ける?
VBAの編集画面(Alt+F11)を開いて、左側の「ThisWorkbook」をダブルクリックして開いたエリアにコードを貼り付けてください。標準モジュールではなく必ずThisWorkbookに貼り付けます。
時間付きのファイル名にするには?
1日に何度も保存する場合は、日付だけでなく時間も入れると同じ日のバックアップが上書きされません。
' 日付と時間を両方入れる(例:Report_20250601_142501.xlsm)
backupName = backupFolder & fileName & "_" & Format(Now, "yyyymmdd_hhnnss") & ".xlsm"
Date の代わりに Now を使うことで、日付だけでなく時刻も取得できます。hhnnss は「時・分・秒」を意味します。分が mm ではなく nn なのは、mm が月(Month)と被るためです。
日付ごとにフォルダを分けて保存するには?
バックアップが増えてきたら、日付ごとにフォルダを分けると整理しやすくなります。
' 日付ごとのフォルダを作って保存する(例:バックアップ/20250601/Report.xlsm)
Dim dateFolder As String
dateFolder = backupFolder & Format(Date, "yyyymmdd") & "¥"
If Dir(dateFolder, vbDirectory) = "" Then
MkDir dateFolder
End If
backupName = dateFolder & fileName & ".xlsm"
毎日フォルダが1つ作られて、その中にその日のバックアップがまとまります。ファイルの一覧がすっきり整理されます。
まとめ
保存のたびに自動バックアップを残す仕組みは、一度設定しておくだけで上書き事故を防げます。
- 基本の仕組み:
Workbook_BeforeSaveイベントとSaveCopyAsを組み合わせる。 - 貼り付ける場所:ThisWorkbookモジュール(標準モジュールではない)。
- 日付のみ:
Format(Date, "yyyymmdd")→ 1日1つのバックアップ。 - 時間付き:
Format(Now, "yyyymmdd_hhnnss")→ 保存のたびに別ファイルになる。 - フォルダ分け:日付ごとのフォルダを作って整理できる。
よくある質問
ThisWorkbookモジュールはどこにある?
VBAの編集画面(Alt+F11)を開くと、左側に「プロジェクトエクスプローラー」が表示されます。その中に「Microsoft Excel Objects」という項目があり、その下に「ThisWorkbook」があります。ダブルクリックで開いてコードを貼り付けてください。
バックアップが増えすぎた場合はどうする?
古いバックアップは手動で削除するか、VBAの中で一定期間より古いファイルを自動削除する処理を追加する方法があります。まずは手動で定期的に整理するだけでも十分です。
SaveCopyAsとSaveAsは何が違う?
SaveCopyAs は今開いているファイルはそのままで、コピーだけ別の場所に保存します。SaveAs は今開いているファイルが新しいファイル名に切り替わります。バックアップ用途には SaveCopyAs が適しています。
xlsxファイルにも使える?
マクロが含まれるファイルはxlsmで保存する必要があります。xlsxはマクロを保存できないため、このコード自体が動きません。このコードを使う場合はファイルをxlsm形式で保存してください。
バックアップの保存先を別のフォルダに変えたい場合は?
backupFolder の部分を変えるだけです。たとえば backupFolder = "C:¥Users¥ユーザー名¥Documents¥backup¥" のように直接フォルダのパスを指定できます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



