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でファイルコピーしてのバックアップ方法など、事前対処の備忘録でした。