shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel】VBA実行後に 「元に戻す」はできないので事前対処

ExcelのVBA実行後、「元に戻す」(Ctrl+Z、undo)はできません。VBAの実行で誤った操作や予期せぬ結果が発生して困ることがあるので、事前に対処方法を考えておくことが重要です。VBAでファイルコピーしてのバックアップ方法など事前対処の備忘録。

使用のExcelは「Microsoft® Excel® for Microsoft 365 MSO」。

 

基本的な考え方として、前述のとおりExcelのVBAは「元に戻す」ができないので、対処できることは次になる。

  • 誤って実行した場合は、保存せずに閉じる。
  • ファイルやフォルダのバックアップを取る。

そのため、VBAの実行前に保存する習慣は重要

なお、Excelと違い、WordのVBA実行後は「元に戻す」が可能だが戻れる範囲に制限もあり、同様にバックアップは重要。

 

内容:

 

バックアップの方法

ファイル復元が可能なシステム利用

ファイルを誤って上書きや、保存後にVBA実行の誤りに気付いた場合でも、バックアップから以前のファイルを復元できる環境であればリスクは軽減します。「Google ドライブ」や「Dropbox 」など様々なサービスがありますが、Microsoft 365を利用しているならOneDriveは追加負担なしで利用可能。自動バックアップオプションもあり、私はこれで十分。

Microsoft Public Affiliate Program (JP)(マイクロソフトアフィリエイトプログラム)

 

コピーしてバックアップ

ファイル復元が可能なシステムの場合、ファイルを何世代前まで復元できるかは利用のシステム次第となる。また、そのようなシステムが利用できないケースもあるので、ファイルをコピーしてバックアップという方法も選択肢になる。手作業だと漏れも発生するので、以下はVBAでファイルコピーをするサンプル。

用途としては、実行するVBAの前に以下コードを挿入してバックアップ漏れの防止など。

 

ファイルやフォルダのバックアップを取るVBAサンプル

ファイルのコピー保存

現在のVBAがあるファイルに、作業日の日付をつけてコピー保存。

Sub ファイルのバックアップ()
    Dim fs As Object
    Dim 元ファイル名 As String
    Dim 元ファイルの拡張子 As String
    Dim バックアップのファイル名 As String
    Dim 回答 As VbMsgBoxResult
    Set fs = CreateObject("Scripting.FileSystemObject")
    
    On Error GoTo エラー処理
        
        元ファイル名 = fs.GetBaseName(ThisWorkbook.Name)
        元ファイルの拡張子 = fs.GetExtensionName(ThisWorkbook.Name)
        バックアップのファイル名 = ThisWorkbook.Path & "\" & 元ファイル名 & "_" & Format(Now(), "yyyymmdd") & "." & 元ファイルの拡張子
        
        fs.CopyFile ThisWorkbook.Path & "\" & ThisWorkbook.Name, バックアップのファイル名, False 'falseは上書き不可'
        
        Set fs = Nothing
        MsgBox "完了しました"
        Exit Sub

エラー処理:
        MsgBox Err.Description 
End Sub

 

元ファイル名、バックアップのファイル名は、次の方法でシート側で変更できるようにするとメンテナンス性も向上する。

 

shikumika.org

 

フォルダのコピー保存

フォルダのバックアップの場合のサンプルは次のとおり。

この事例は、前述のとおりシートにコピー場所等の情報を記載しており、「設定」という名前のシートのセル$B$1に元フォルダ、$B$2にコピー先フォルダの情報を記載。

Sub フォルダのバックアップ()
 
    Dim fs As Object
    Dim 元フォルダ As String
    Dim コピー先フォルダ As String
    Dim 回答 As VbMsgBoxResult
   
    回答 = MsgBox("フォルダのバックアップをしますか?", vbYesNo + vbQuestion)
    If 回答 = vbYes Then
    
        Set fs = CreateObject("Scripting.FileSystemObject")
        
        元フォルダ = ThisWorkbook.Sheets("設定").Cells(1, 2).Value
        コピー先フォルダ = ThisWorkbook.Sheets("設定").Cells(2, 2).Value
        
        'コピー先のフォルダを作成してコピー'
        MkDir コピー先フォルダ
        fs.CopyFolder 元フォルダ, コピー先フォルダ
        
        MsgBox "完了しました"
    End If

End Sub

OneDriveに同期したフォルダの場合の注意点

OneDriveに同期したフォルダでは、ローカルパスが取得できずに上記プログラムがうまく動作しない可能性があるので、次をご覧ください。

shikumika.org

 

以上、ExcelのVBAの実行後に「元に戻す」(Ctrl+Z、undo)はできないので、VBAでファイルコピーしてのバックアップ方法など、事前対処の備忘録でした。