web-dev-qa-db-ja.com

元に戻すをExcelVBAマクロに組み込む

Excelマクロは、実行後に「元に戻す」を使用できないようです。 undo機能をExcelのVBAマクロに組み込む方法はありますか?

23
Fred Nurke

ExcelVBAにはApplication.OnUndoこれを処理する関数:

Public Sub DoSomething

    ... do stuff here

    Application.OnUndo "Undo something", "UnDoSomething"
End Sub

Public Sub UnDoSomething

    ... reverse the action here

End Sub
22
e.James

マクロの最初の行でコピーをバックアップディレクトリに保存し、そのブックを閉じて元のブックを再度開くので、私の考えは非常に単純です。マクロの実行結果が気に入らない場合は、保存したブックをプルアップしてください。シンプルにしてくださいね?

6
CABecker

私は常にマクロを実行する直前に(少なくともテスト中は)保存します。その後、すべてが洋ナシ型になった場合は、保存せずに終了して再度開くことができます。

それを実際のマクロに焼き付けるには、基本的に、変更されたすべての古い状態(セルの内容、数式、書式設定など)をリストに記録してから、そのリストを逆の順序で再生する元に戻すマクロを用意する必要があります。

たとえば、マクロがセルC22の内容を「3」から「7」に変更し、フォーマットを「一般」から「数値、小数点以下第2位」に変更した場合、リストは次のようになります。

C22 value  3
C22 format general

これを逆の順序で(別のマクロで)再生すると、変更が元に戻ります。

次のようなマクロ取り消し情報を保持するために、追加のシート全体を用意することができます。

Step   Cell   Type    Value
----   ----   -----   -------
   1   C22    value         3
       C22    format  general
   2...

残念ながら、「実際の」取り消しとうまく統合することはできませんが、それを回避する方法はないと思います。

3
paxdiablo