こんにちは、ユーキです。
バックアップを取るマクロのアドイン化についてお話します。
前回、バックアップを取るマクロを作成しました(【Excel VBA】バックアップを取るマクロ を見る)。マクロだと、バックアップを取りたいファイルすべてに処理を記述する必要があり、現実的ではありません。
アドイン化することで、すべてのEXCELファイルをバックアップ対象とするために、アドインにしたいと思います。
アドインでバックアップを取得する
アドインでWorkbookBeforeSaveイベントを取得させるために、WithEventsキーワードを使います。アドインの作成方法は、アドインの作成 を参考にしてください。
Applicationオブジェクトの利用
まずは、イベントを受け取るための仕掛けを作ります。ApplicationオブジェクトをWithEventsキーワードを指定して宣言します。変数名はなんでもOKです。今回は「App」とします。
宣言するのは、アドインの「ThisWorkbook」モジュールに記載をします。
Private WithEvents App As Application
保存前イベントの定義
次に、保存前イベントを定義します。こちらも、アドインの「ThisWorkbook」モジュールに記載をします。
イベントは自身で書いてもいいですが、引数を正しく定義する必要があるので、画面上部のプルダウンから選択するほうが無難です。
先ほど宣言した、Applicationオブジェクト「App」が選択できるようになっているはずですので、選択します。右側のプルダウンから、「WorkbookBeforeSave」を選択します。
Private Sub App_WorkbookBeforeSave(ByVal wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub
もしイベントの選択を間違えてしまった場合、コードをそのまま削除すればOKです。
バックアップ処理
前回の バックアップを取るマクロを作成 とほぼ同じコードとなりますが、ThisWorkbookとしていた箇所を、wb(保存前イベントの第1引数) に置き換えます。
この処理は、先ほど定義した「App_WorkbookBeforeSave」イベントに直接記述してもいいのですが、コードの可読性を上げるため標準モジュールに記述します。
Public Sub BeforeSaveBackup(ByVal wb As Workbook)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'拡張子なしのファイル名取得
Dim fileNm As String
fileNm = fso.GetBaseName(ThisWorkbook.Path & "\" & wb.Name)
'ファイルの拡張子
Dim extName As String
extName = fso.GetExtensionName(wb.Path & "\" & wb.Name)
'日付文字列 年月日時分秒を取得
Dim timeTx As String
timeTx = Format(Now(), "yyyyMMddhhnnss")
fso.CopyFile wb.Path & "\" & wb.Name, wb.Path & "\backup\" & fileNm & "_" & timeTx & "." & extName
End Sub
この処理を「App_WorkbookBeforeSave」イベントから呼び出すようにします。
Private Sub App_WorkbookBeforeSave(ByVal wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call BeforeSaveBackup(wb)
End Sub
記述する処理はこれでおしまいです。
動作確認
では、作成したアドインを動かしてみましょう。
まずは、Excelファイルと同じ階層にbackupフォルダを作成した状態を準備します。
backupフォルダには何もありません。
Sample.xlsxを起動し(アドインはすでに設定済)、保存を行います。保存は、Ctrl+Sのショートカットでも、保存ボタンでも、上書き保存、名前を付けて保存でも、なんでもOKです。
無事にバックアップファイルが作成されました!
注意点
バックアップは際限なくバックアップファイルを作成し続けてしまいます。アドイン化をすると、知らないうちにファイルが増えていくことになってしまいます。定期的にバックアップフォルダは削除するようにしてください。
また、対象ファイルがある階層の「backup」フォルダに保存するようにしているので、フォルダが存在しないとエラーになってしまいます。アドインでバックアップを取るのであれば、バックアップフォルダは固定化をしたほうがよいかもしれません。
まとめ
今回は、バックアップを取るマクロのアドイン化についてでした。
- WithEventsキーワードを使う
- イベント記述は、アドインのThisWorkbookに記述する
少しでも参考になれば、幸いです。