Excel VBA:Excelのファイルを上書き保存される前にバックアップ(コピー)を取ってファイルの世代管理をできるようにするサンプルプログラム

編集しているExcelのファイルを上書き保存する際に、上書き保存される前の状態のファイルをバックアップして世代管理できるようにするサンプルプログラムを覚書。

自動保存機能を使えば定期的にファイルを自動で保存して世代管理的なことはできるけど、時間間隔の指定しかできないのでイマイチ。

世代管理という意味では上書き保存されるタイミングごとに上書き保存される前の状態をとっておかないと意味が無いので上書き保存されたタイミングで上書き保存される前のファイルの状態のコピーを取るVBAのサンプルプログラムです。

世代番号として上書き保存が実行された時の日時(秒まで)を使用しています。
スポンサードリンク


VBAサンプルプログラム概要

上書き保存される前のファイルに世代番号を付加てコピーを行います。

"上書き保存される前"に処理をする必要があるので、Excelワークブックの"Workbook_BeforeSave"イベントプロシージャに処理を記述します。

ExcelのVBAで用意されている"FileCopy"は、開かれているファイルをコピーすることはできないので、"Scripting.FileSystemObject"オブジェクトの"CopyFile"メソッドを使用してコピーします。

サンプルプログラムの使用方法

ワークブックのイベントプロシージャを使用するので、リボンツールバーの[開発]タブの[Visual Basic]をクリックしてVBAのエディタを開きます。

次に左のツリーから[ThisWorkbook]をダブルクリックしてワークブックのイベントプロシージャモジュールを表示させてください。

後は以下のサンプルプログラムをそのままモジュールに貼り付ければOKです。

ブックを上書き保存されるたびに保存される前の状態が世代番号(上書き保存時の日時を使用)が付加されたファイル名で保存されます。

VBAサンプルプログラム

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim bkPath As String, bkName As String, bkHistoryName As String
Dim bkExtension As String, strHistoryNo As String
Dim objFSO As Object

Set objFSO = CreateObject("Scripting.FileSystemObject")

'このワークブックファイルの保存フォルダのパスを取得
bkPath = ThisWorkbook.Path

'このワークブックファイルのフルパスを含めたファイル名を取得
bkName = objFSO.GetBaseName(ThisWorkbook.Name)

'世代番号として保存時の日時を使用
strHistoryNo = Format(Now(), "yyyymmddhhmmss")

'このワークブックファイルの拡張子を取得
bkExtension = objFSO.GetExtensionName(ThisWorkbook.Name)

'世代番号をつけたファイル名を生成
bkHistoryName = objFSO.BuildPath(bkPath, bkName & "_" & strHistoryNo & "." & bkExtension)

'上書き保存される前のファイルを世代番号付きのファイル名でコピー
objFSO.CopyFile ThisWorkbook.FullName, bkHistoryName, True

End Sub

サンプルプログラムのポイント

サンプルプログラムのポイントを説明します。

ワークブックが保存される前に処理を実行できる"Workbook_BeforeSave"イベントプロシージャの使用

世代管理のタイミングとしては、上書き保存が実行されるタイミングとなりますが、上書き保存される前にコピーを取らないとなりません。

"Workbook_BeforeSave"イベントプロシージャは、上書き保存が実行された際に実際にファイルが保存される前に実行されます。

世代番号を日時から生成し、元のファイル名と拡張子の手前に世代管理番号を付加

世代管理番号には上書き保存が行われた時の日時を使用しています。

ファイルの名前と拡張に間に世代管理番号を入れるためにファイルの保存先パス、ファイルの拡張子を除いたファイル名(ベース名)、拡張子に分解してそれぞれ変数に格納し、後でそれらを組み合わせてファイル名をパスを含めて生成させています。

世代管理番号は、YYYY/MM/DD hh:mm:ssから"/"、":"を省いた"YYYYMMDDhhmmss"という文字列をFormat関数で生成させて世代管理番号としています。

上書き保存される前のファイルのコピーには"Scripting.FileSystemObject"を使用

ExcelのVBAにもファイルをコピーする"FileCopy"がありますが、開かれているファイルに対しては実行できないので使用できないため、"Scripting.FileSystemObject"オブジェクトの"CopyFile"メソッドを使用してファイルをコピーしています。

編集中のExcelのファイルを上書き保存のタイミングでコピーを取って世代管理するサンプルプログラムまとめ

編集中のExcelのファイルを上書き保存されるタイミングで上書き保存される前にファイルのコピーを取って世代管理するサンプルプログラムを紹介しました。

上書き保存されるたびにファイルがどんどん作成されていくことになるので、放っておくと多量のファイルができてしまうので、ファイルの編集が終了したら任意の数分残してマメに削除指定ください。

世代管理するファイル数を指定できるようにプログラムを拡張することもできるのですが、プログラムにミスがあると誤って想定外のファイルを削除してしまう可能性があるため、その部分はサンプルプログラムには載せませんでしたが要望があればコメント欄にでもリクエストしてください。

スポンサードリンク

  

関連記事