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は追加負担なしで利用可能。自動バックアップオプションもあり、私はこれで十分。
コピーしてバックアップ
ファイル復元が可能なシステムの場合、ファイルを何世代前まで復元できるかは利用のシステム次第となる。また、そのようなシステムが利用できないケースもあるので、ファイルをコピーしてバックアップという方法も選択肢になる。手作業だと漏れも発生するので、以下は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
元ファイル名、バックアップのファイル名は、次の方法でシート側で変更できるようにするとメンテナンス性も向上する。
フォルダのコピー保存
フォルダのバックアップの場合のサンプルは次のとおり。
この事例は、前述のとおりシートにコピー場所等の情報を記載しており、「設定」という名前のシートのセル$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に同期したフォルダでは、ローカルパスが取得できずに上記プログラムがうまく動作しない可能性があるので、次をご覧ください。
以上、ExcelのVBAの実行後に「元に戻す」(Ctrl+Z、undo)はできないので、VBAでファイルコピーしてのバックアップ方法など、事前対処の備忘録でした。