ユーザーフォームで Undo機能を使うには?

Question 32.4 Previous Next
エクセル97-2000を使っています。
ユーザーフォームで編集中にundo機能などの編集ができないでしょうか。仕事でぜひ必要です。よろしくお願いします。
Answer   Copyright (C) 2000.10.23 永井善王
Undo機能とは、ユーザーが入力操作中に、直前に行った操作を「元に戻す」または「やり直す」ときに利用する機能のことであり、例えば、セルに値を入力した直後、あるいは、セルの値を修正した直後に[編集]メニューに表示される[元に戻す]をクリックすると、直前に行った操作が取消されてセルの値が元に戻ることなどと、理解してよいでしょうか。

ユーザーフォームでも[元に戻す]と[やり直し]コマンドがサポートされています。
手操作の場合は通常、
Ctrlキーを押しながら Zキーを押すと[元に戻す]、
Ctrlキーを押しながら Yキーを押すと[やり直し]となります。

もしも、これで足りるなら、わざわざマクロを組む必要はありません。

マクロで利用可能なUndo機能には、どのようなものがあるでしょうか。下表で概要を見てみましょう。
  機能 構文
Undo メソッド ユーザーが最後に実行した操作を取り消す expression.Undo
UndoAction メソッド 取消可能な直前のアクション(*)を取り消す object.UndoAction
RedoAction メソッド 最後に行った元に戻す操作を取り消す object.RedoAction
OnUndo メソッド [編集] メニューの [元に戻す] でのメニュー項目名や、クリックしたときに実行されるプロシージャ名を設定する expression.OnUndo(Text, Procedure)
Repeat メソッド [編集] メニューの [繰り返し] でのメニュー項目名や、クリックしたときに実行されるプロシージャ名を返す expression.OnRepeat(Text, Procedure)
CanUndo プロパティ 直前にユーザーが行った操作を元に戻すことが可能かどうかを取得する object.CanUndo
CanRedo プロパティ 最後に行った元に戻す操作を取り消すことが可能かどうかを取得する object.CanRedo
(*) 直前のアクションなら必ず元に戻せる訳ではなく、取消可能なアクションと取消不可能なアクションに分かれる

では、具体的に考えてみましょう。
質問文の「ユーザーフォームで編集中」とは、例えば『ユーザーフォームのテキストボックスに入力中』。 「undo機能などの編集」とは、例えば『元に戻す』とした場合、マクロはどう書けば良いでしょうか。下図を例にして進めます。


初期表示されたユーザーフォーム


テキストボックスに「中止」と追加入力してから、[元に戻す]ボタンをクリックする 



テキストボックスが追加入力する前の状態に戻せた場合に、表示されるメッセージボックスマクロの動きを分かり易くするために、わざわざ表示していますが、なくても構いません。

マクロは、[元に戻す]ボタンがクリックされたときに実行されるイベントプロシージャとして、次のようにVBE画面で、ユーザーフォームのコードとして作成します。
Private Sub CommandButton1_Click()        '[元に戻す]ボタンがクリックされたときに実行
    If UserForm1.CanUndo = True Then        '元に戻すことが可能ならば
        UserForm1.UndoAction                '直前のアクションを取り消す
        MsgBox "元に戻しました", vbInformation, "すぐマク"
    Else
        MsgBox "元に戻せません", vbExclamation, "すぐマク"
    End If
End Sub
2行目で CanUndoプロパティで元に戻すことが可能かどうか、3行目で UndoActionメソッドで直前のアクションを取り消しています。
以上、基本的な部分を解説しました。その他の機能は、これを参考にして組んでみてください。

サンプルブックのダウンロードは ここをクリック  (YNxv9d6_Undo.xls 47KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

Excel VBA Macro