一部を修正して上書き保存した後に、「やらかした!」と気づいた経験はないですか?
ローカル上に保存しているファイルの場合、上書き保存する前のデータに戻すことは困難になります。
そこで今回は、保存時にバックアップファイルを自動で作成する仕組みの実現方法について解説していきます。

※こちらで実現したファイルは記事の最後にて配布しています。
1. 開発手順
今回は、対象のファイルを上書き保存すると同時に、予め指定したフォルダ内にバックアップファイルを作成するという仕組みを実現します。
対象のファイルを保存すると同時に何かしらの処理を実行するには、「ブックモジュール」を活用します。
ブックモジュールは、[開発]タブから[Visual Basic]を選択し、表示された画面(VBE)のプロジェクトエクスプローラーから[ThisWorkbook]を選択することで表示することができます。

[開発]タブが表示されていない場合は、「Alt + F11」でもVBEの画面を開くことができます。
また、プロジェクトエクスプローラーが表示されていない場合は、「Ctrl + R」で表示することができます。
次に、ファイルを保存したときに、保存される前に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、ブックモジュールの左上のリストから[Workbook]を選択します。

[Workbook]を選択すると、自動で「Workbook_Open」というプロシージャが表示されます。
このプロシージャは、Excelファイルの立ち上げ時に自動で実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、ファイルを保存したときに、保存される前に処理が実行されるものになります。
そのため、右上のリストから[BeforeSave]を選択します。

表示された「Workbook_BeforeSave」というプロシージャを活用します。
「Workbook_Open」というプロシージャに関しては削除して問題ないです。

2. コードの記述
以下のコードを記述します。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim fP As String
fP = Me.Path & "\_bk"
Dim fN As String
fN = Format(Now, "yyyymmdd_hhnn") & ".xlsm"
Me.SaveCopyAs fP & "\" & fN
End Sub
では、コードについて解説していきます。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'省略
End Sub
「Workbook_BeforeSave」というプロシージャは、対象のファイルを保存したときに、保存される前に実行されます。
処理が完了すると同時に、対象のファイルは保存されます。
今回は使用しませんが、引数の「Cancel」を処理内でTrue(Cancel = True)にすると、処理が完了した後に保存されなくなります。
Dim fP As String
fP = Me.Path & "\_bk"
変数「fP」にバックアップファイルを保存する先のフォルダのパスを格納しています。
こちらでは、対象のExcelファイルが保存されているフォルダ内の「_bk」というフォルダのパスを指定しています。

「Me.Path」で自分自身(コードを記述しているファイル)が格納されているフォルダのパスを取得し、「&」で「_bk」フォルダのパスを加えています。
Dim fN As String
fN = Format(Now, "yyyymmdd_hhnn") & ".xlsm"
変数「fN」にバックアップファイルを保存する際のファイル名を格納しています。
ファイル名は、「現在の日付_現在の時刻.xlsm」となるように指定しています。
Me.SaveCopyAs fP & "\" & fN
自分自身(コードを記述しているファイル) のコピーを保存しています。
保存先やファイル名は、変数「fP」と「fN」を活用して指定しています。
3. 完成
以上の内容で実現できます。
開発したファイル(以下の画像では「お問い合わせ管理.xlsm」)を開いて上書き保存すると同時に、同じ配下の「_bk」フォルダ内にバックアップファイルが作成されます。

ファイルは1分単位の名前で保存されるので、1分以内に繰り返し保存した場合は、バックアップファイルの同じ名前のファイルが上書きされます。
▼サンプルファイル▼













































































































































