VBAの実行前に作成したマクロを別ファイルで保存

スポンサーリンク

保存する前に動作させたVBAがフリーズ

保存するのを忘れてVBAコードを実行した結果、Excelがフリーズしてもう一度コードを書きなおすのは多分あるあるだと思うのですが、この間も懲りずにやらかしました。

そこでコード実行時にバックアップを作成するコードを考えてみましたのでご紹介します。

通常のファイルの保存での問題点を解決するSaveCopyAsメソッド

ファイルをバックアップ用に保存することを考えた場合、通常の上書き保存(ThisWorkbook.Save)だと「保存前の状況に戻したい」場合に困ることがあります。

また、「名前を付けて保存(ThisWorkbook.SaveAs ○○)」だとコピーの動作後に名前をつけて保存したファイルが現在開いている状態になり、元のファイルは保存前の状態で閉じられた扱いになってしまいます。

理想的には①現在のファイルは保存前の状態で維持しつつ、②作成したツールをバックアップとして保存することで、この挙動をかなえてくれるのがSaveCopyAsメソッドです。
(FileSystemObjectのCopyFileだと以前の保存状態のものをバックアップに保存、今のファイルを新しく保存する運用でSaveCopyAsメソッドとはバックアップファイルと現在のファイルが逆になります。今回はSaveCopyAsメソッドの挙動が想定していたものでしたのでSaveCopyAsメソッドを利用します。)

スポンサーリンク

実行前にマクロファイルをバックアップとして保存するコードの紹介

以下のコードをツールに組み込んでおいて、作成したコードの先頭に「Call 実行前にVBAを含むツールファイルを自動保存」の1行を入力しておくことでツールファイルが格納されているフォルダに「backUp」フォルダが作成され、ツールファイルのバックアップが保存されます。

元になるツールファイル自体は保存前の状態、バックアップファイルはツールの動作時の状態になりますので、フリーズしてしまったり、無限ループに陥って強制終了した場合などは「backUp」フォルダ内の直近で作成されたファイルを利用すればすぐに復旧可能です。

Sub 実行前にVBAを含むツールファイルを自動保存()

    Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
    '参照設定「Microsoft Scripting Runtime」を設定している場合
    'Dim fso As FileSystemObject: Set fso = New FileSystemObject
    
    If Not fso.folderExists(ThisWorkbook.Path & "\backUp") Then
        fso.createFolder (ThisWorkbook.Path & "\backUp")
    End If

    ThisWorkbook.SaveCopyAs (ThisWorkbook.Path & "\backUp\" & Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4) & Format(Now, "yyyymmdd_hhmmss") & ".xlsm")

End Sub


おすすめ書籍 (広告)

コメント