【VBA】バックアップの機能を持たせる

VBAを実行して、セルの値が書き換わると、[アンドゥ] や [Ctrl + Z] では元に戻せないんですよね。

で、元に戻せる方法を考えました。

コード

Sub バックアップしてから処理をする()

Call バックアップ

Range("G2").Value = "しまった!"

End Sub
Sub バックアップ()

ActiveSheet.Range("B2:G17").Copy Destination:= _
Sheets("BuckUp").Range("B2:G17")

End Sub
Sub 元に戻す()

Sheets("BuckUp").Range("B2:G17").Copy Destination:= _
ActiveSheet.Range("B2:G17")

End Sub

解説

まずは、どういった時にバックアップが必要か、を見てみます。

元に戻したいパターン

セル [B2] ~ [G17] の範囲が、表になっています。
セル [G2](黄色セル) は、セル [B17](オレンジ色セル) を参照する数式が入っています。

ある処理を実行したところ、セル [G2](黄色セル) が、想定していない値に書き換わってしまいました。

Sub バックアップしてから処理をする()

Call バックアップ

Range("G2").Value = "しまった!"

End Sub

例として分かり易く、「しまった!」 という値に書き換わる処理を入れてみました。

こういう失敗をしそうな処理の前に、プロシージャー「バックアップ」を Call で呼び出して、バックアップを取っておこう、という考え方です。

バックアップを取る

Sub バックアップ()

ActiveSheet.Range("B2:G17").Copy Destination:= _
Sheets("BuckUp").Range("B2:G17")

End Sub

プロシージャー「バックアップ」は、
・シート「テーブル」の表を、コピー
・シート「Buckup」に、貼り付け
という処理をしています。

下の図は、プロシージャー「バックアップ」が実行された後の、バックアップ先である、シート「Buckup」の様子です。
罫線や、セル色 などの書式や、数式もバックアップされています。

元に戻す

Sub 元に戻す()

Sheets("BuckUp").Range("B2:G17").Copy Destination:= _
ActiveSheet.Range("B2:G17")

End Sub

プロシージャー「元に戻す」は、
・シート「Buckup」の 表を、コピー
・シート「テーブル」の表に、貼り付け
という処理になります。

ちなみに、表は、どちらのシートにコピペされる時も、私の環境では「上書き」されています。特に「すでにデータがあります。上書きしますか?」といったメッセージは出て来ませんでした。
問答無用で「上書き」してくれる様です。
※なので間違えてバックアップしないように、、、。

最後に

今回は、シート「Buckup」 をあらかじめ準備しておきました。
これは、新規でシートを作成して、そこにバックアップしても良いですね。


まずは、バックアップを取るヒントになればと思い、一つのパターンを紹介してみました。ご自分の都合に合わせて作ってみて下さい。

コメント

タイトルとURLをコピーしました