プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
ExcelVBA、Excel2010でブックを上書き保存したときにバックアップファイルを作成する(前回のバックアップファイルを上書きしないで履歴として残す形)
結論から書くと、対象となるブックのVBAエディタを開いて
「ThisWorkbook」のところに以下のようなコードを書けば、
できるっちゃーできます。

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

'現在時刻取得
Dim nowTime As String
nowTime = Format(Date, "yyyymmdd") & Hour(Time) & Minute(Time) & Second(Time)

'ファイルパス取得
Dim savePath As String
savePath = ActiveWorkbook.Path

Dim fName As String
fName = savePath & "\bk_" & nowTime & "_" & ActiveWorkbook.Name

ActiveWorkbook.SaveCopyAs (fName)

End Sub
※「ActiveWorkbook」は「ThisWorkbook」でも良いです。

それでは、詳細を書いていきます。

とあるお客さまがとあるExcelファイルを使ってとある情報を管理していましてね。
過去のデータと比較する必要に迫られる機会があるので、
保存する度にファイルをコピーして履歴を残していたそうです。

これが微妙に面倒くさい。
上書き保存したときに勝手にコピーしてくれるようにできないかな?

そう訊かれたのが今回のきっかけです。
うん、できるよ(--)

というわけで、そのExcelファイルのVBAエディタを開いて
「ThisWorkbook」のところにこんなコードを書いてあげましたφ(--)

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

'現在時刻取得
Dim nowTime As String
nowTime = Format(Date, "yyyymmdd") & Hour(Time) & Minute(Time) & Second(Time)

'ファイルパス取得
Dim savePath As String
savePath = ActiveWorkbook.Path

Dim fName As String
fName = savePath & "\bk_" & nowTime & "_" & ActiveWorkbook.Name

ActiveWorkbook.SaveCopyAs (fName)

End Sub
※「ActiveWorkbook」は「ThisWorkbook」でも良いです。

これで、上書き保存をする度に、現在時刻付きのバックアップファイルが
元のExcelファイルと同じところに作られるようになります。
ファイル名に時刻が入っているので、コピーしたファイル同士が上書きされることもありません。

そんな感じ\(--)/

……で終わらせても良いのですが、せっかくなので簡単に補足しておきましょうか。

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

は、その名の通り保存後のイベントです。
Excel2010以降で使えるイベントなので、2007以前の方はごめんなさい。

Dim nowTime As String
nowTime = Format(Date, "yyyymmdd") & Hour(Time) & Minute(Time) & Second(Time)

で現在時刻を取得して

Dim savePath As String
savePath = ActiveWorkbook.Path

でブックのパスを取得しています。

この2つを元にして

Dim fName As String
fName = savePath & "\bk_" & nowTime & "_" & ActiveWorkbook.Name

でバックアップファイルの名前(パス付き)を作っています。
「ファイル名のセンスが悪いな~」と感じた方は、お好きに変えてください。
けっ(-A-)

あとは

ActiveWorkbook.SaveCopyAs (fName)

でファイルのコピーを保存しています。
最初は「FileCopy」を使って

FileCopy ActiveWorkbook.FullName fName

のようにやろうとしたのですが、このやり方はダメでした。
開いているブックをコピーしようとするとエラーになるようです。

これで上書き保存時にバックアップファイルが作成されるようになります。
上書き保存する度にその時点のファイルが一つずつ増えていきますよ。

欲を言えば、全ブックに一括で反映されるようにしたかったのですけどね。
それは今のところ実現できていません。

ExcelVBA、マクロをすべてのブックに適用する

を参考にして、該当のコードを「PERSONAL.XLS(PERSONAL.XLSB)」に埋め込んだのですが、
期待通りの結果にはなりませんでした。
ブックのVBAエディタを開いて該当のコードを表示しながら上書き保存するとコードが実行されますが、
普通にExcelを使っている状態で上書き保存しても実行されないようです。

「Workbook_AfterSave」や「Workbook_BeforeSave」は、
「PERSONAL.XLS(PERSONAL.XLSB)」に埋め込んで使えないのですかね(--?

何か分かったら追記します。

取りあえず、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:ExcelVBA  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事