2015.
03.
05
14:17:52
結論から書くと、対象となるブックのVBAエディタを開いて
「ThisWorkbook」のところに以下のようなコードを書けば、
できるっちゃーできます。
それでは、詳細を書いていきます。
とあるお客さまがとあるExcelファイルを使ってとある情報を管理していましてね。
過去のデータと比較する必要に迫られる機会があるので、
保存する度にファイルをコピーして履歴を残していたそうです。
これが微妙に面倒くさい。
上書き保存したときに勝手にコピーしてくれるようにできないかな?
そう訊かれたのが今回のきっかけです。
うん、できるよ(--)
というわけで、そのExcelファイルのVBAエディタを開いて
「ThisWorkbook」のところにこんなコードを書いてあげましたφ(--)
これで、上書き保存をする度に、現在時刻付きのバックアップファイルが
元のExcelファイルと同じところに作られるようになります。
ファイル名に時刻が入っているので、コピーしたファイル同士が上書きされることもありません。
そんな感じ\(--)/
……で終わらせても良いのですが、せっかくなので簡単に補足しておきましょうか。
は、その名の通り保存後のイベントです。
Excel2010以降で使えるイベントなので、2007以前の方はごめんなさい。
で現在時刻を取得して
でブックのパスを取得しています。
この2つを元にして
でバックアップファイルの名前(パス付き)を作っています。
「ファイル名のセンスが悪いな~」と感じた方は、お好きに変えてください。
けっ(-A-)
あとは
でファイルのコピーを保存しています。
最初は「FileCopy」を使って
のようにやろうとしたのですが、このやり方はダメでした。
開いているブックをコピーしようとするとエラーになるようです。
これで上書き保存時にバックアップファイルが作成されるようになります。
上書き保存する度にその時点のファイルが一つずつ増えていきますよ。
欲を言えば、全ブックに一括で反映されるようにしたかったのですけどね。
それは今のところ実現できていません。
ExcelVBA、マクロをすべてのブックに適用する
を参考にして、該当のコードを「PERSONAL.XLS(PERSONAL.XLSB)」に埋め込んだのですが、
期待通りの結果にはなりませんでした。
ブックのVBAエディタを開いて該当のコードを表示しながら上書き保存するとコードが実行されますが、
普通にExcelを使っている状態で上書き保存しても実行されないようです。
「Workbook_AfterSave」や「Workbook_BeforeSave」は、
「PERSONAL.XLS(PERSONAL.XLSB)」に埋め込んで使えないのですかね(--?
何か分かったら追記します。
取りあえず、完了\(--)/
「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」でも良いです。'現在時刻取得
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
それでは、詳細を書いていきます。
とあるお客さまがとある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」でも良いです。'現在時刻取得
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
これで、上書き保存をする度に、現在時刻付きのバックアップファイルが
元の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)
nowTime = Format(Date, "yyyymmdd") & Hour(Time) & Minute(Time) & Second(Time)
で現在時刻を取得して
Dim savePath As String
savePath = ActiveWorkbook.Path
savePath = ActiveWorkbook.Path
でブックのパスを取得しています。
この2つを元にして
Dim fName As String
fName = savePath & "\bk_" & nowTime & "_" & ActiveWorkbook.Name
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)」に埋め込んで使えないのですかね(--?
何か分かったら追記します。
取りあえず、完了\(--)/