VBAで「元に戻す」方法

A1に”A”と入力
Enter
A2に”B”と入力
Enter
Ctrl+zで「元に戻す」を実行

記録されるマクロは以下のようになる。

    ActiveCell.FormulaR1C1 = "A"
    Range("A2").Select

「元に戻す」を実行すると、
「元に戻す」は記録されず、
直前の操作が記録から消える。

ちなみにマクロの記録は、リアルタイムでコードが生成されている。
なので上記の動作を記録するときにVBEを起動しておくと、
何か処理をするたびにコードが増えていく。
A2に”B”を入力というコードも一度は記録されるのが確認できる。

では記録されなかった「元に戻す」はどう書くかというと

Application.Undo

これで元に戻せるのだが1つ注意すべき点は

・直前の編集がマクロで変更を行ったものでないこと

例えばA1に”A”と入力した後で下記のコードを実行するとエラーが発生する

    ActiveCell.FormulaR1C1 = "B"
    Application.Undo

しかし同じようにA1に”A”と入力した後で下記のコード実行してもエラーは発生しない

    MsgBox "test"
    Application.Undo

msdnには下記のような表記がある

注釈
Undo メソッドは、マクロを実行する前にユーザーが実行した最後の操作を元に戻す場合にだけ使用できます。このメソッドは、マクロの先頭に記述する必要があります。Visual Basic で実行したコマンドは元に戻すことができません。
Application.Undo メソッド (Excel)

直前の操作がシートに何も影響を与えていなければ、必ずしも先頭にUndoメソッドを記載しなくても良いようだ。

Worksheet_Changeに仕込んで、望まない処理をされたときに戻すときに使ったりしている。