はじめに
現在開いているブックのバックアップを残す方法を考えてみます。
Excelのブックは他のアプリケーションと同じように、ファイル(ブック)を開くとメモリー上の展開されて編集できるようになります。
メモリー上に展開されたブックは上書き保存するか、名前を付けて保存(他のフォルダーに保存する場合も含む)しない限り、記録は残りません。
バックアップを残す場合は、どの時点の状態を残すかを考慮する必要があります。
最新の状態にしていくバックアップ
ブックを新しいものに更新していく場合は、現在のブックを上書き保存(Save)して、日付や時間をファイル名(ブック名)にして名前を付けて保存していけば、最新の状態を保存していく事になります。
プログラムは、以下のようになります。
ThisWorkbook.Save
ThisWorkbook.SaveCopyAs バックアップ用のファイル名
Sub myBackup()
ThisWorkbook.Save '元のファイルをセーブ
Dim fname As String
fname = Format(Now, "yyyymmdd_hhmm_") & ThisWorkbook.Name
'ファイルバックアップ(同じフォルダ)
ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & fname
MsgBox "保存完了"
End Sub
このプログラムでは、ボタンなどを設けてユーザーの保存したいタイミングでバックアップファイルを作成できます。
ファイル名が Book1.xlsm であれば、日付と時間を付けて、20240520_1122_Book1.xlsm というファイル名で保存されていきます。
以前の状態を残すバックアップ
今度は、ブックを開いた時に以前バックアップしたファイルの更新日を調査して、必要ならバックアップを取るという方法です。
この方法では、バックアップを取るためのボタン操作などは必要ありません。
プログラムは、ファイルシステムオブジェクトを使って以下のようになります。
FSO.CopyFile ThisWorkbook.FullName, ThisWorkbook.Path & “\” & fname
ファイルシステムオブジェクト(FileSystemObject)を使うのは、更新日時を取得したいからです。
Sub myOriginalBackup()
Dim fname As String
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim myFile As Object
Set myFile = FSO.getFile(ThisWorkbook.FullName) '現在(編集前)のブック
'更新日時をファイル名に付ける(更新日で判断する)
fname = Format(myFile.DateLastModified, "yyyymmdd_hhmm_") & ThisWorkbook.Name
'既に同じ名前のファイルがあれば終了(更新されていないのでバックアップは不要と判断)
If FSO.FileExists(ThisWorkbook.Path & "\" & fname) Then Exit Sub
' 開いているファイルをコピー(日付付きのファイル名でバックアップ)
FSO.CopyFile ThisWorkbook.FullName, ThisWorkbook.Path & "\" & fname
End Sub
このプログラムを、ThisWorkbookのOpenイベントプロシージャで実行するようにします。

'ThisWorkbookモジュールに記述します。
Private Sub Workbook_Open()
Call myOriginalBackup
End Sub
プログラムの動作
ブックを開くときに、上記の myOriginalBackup が実行されると 「更新日時_ファイル名」でバックアップファイル名を作成します。
バックアップファイル名で既に同じファイル名が存在すれば、バックアップファイルを作る必要は無いのでプログラムは終了します。
もし同じ名前のバックアップファイルが無ければ、前回から更新されているのでバックアップファイルを作ります。
このプログラムでは、ブック編集後の保存については通常通りの操作でユーザーに任せていますが、ThisWorkbook の BeforeClose で、Me.Save とすれば、ファイルを閉じるたびに上書きされるようになり、次回必要ならバックアップを取るようになります。
ブックを閉じる際に保存する方法については以下を参照してください。
・自動で保存して終了・保存せずに終了
まとめ
今回はバックアップを取る2つの方法について解説しました。
1つ目の方法ではユーザーのタイミングでバックアップを取る事ができ、
2つ目の方法はユーザーが意識することなくバックアップを取ることができます。
ただし、2つ目の方法では分単位で時間を判別しているので1分以内に再度ブックを開くと上手く動作しない事があるでしょう。