MW211 EXIT

devlog
ExcelVBA/入力チェックの後始末
2017年12月25日
入力チェックしたはいいが、警告ダイアログだけ出して、
不正な入力を野放しにしてはいけない(意味がない)。

クリアしちまえばいいのだろうが、
上書する前の元の値までなくなってしまうのはいただけない。

ということで、元の値に戻す方法。UNDOを使う。
┌──────────────────────────────────────┐
│Private Sub Worksheet_Change(ByVal Target As Range)                         │
│    If Target.Value <> "" Then                                              │
│        If Target.Value <> "御意" Then                                      │
│            MsgBox "入力エラー", vbCritical                                 │
│            Application.EnableEvents = False                                │
│            Application.Undo                                                │
│            Application.EnableEvents = True                                 │
│        End If                                                              │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
こんな感じ(「御意」と入力しないと元に戻される)。

まず、「Worksheet_Change()」は入力後のイベントのため
入力前の値を保持できていない。
そこで、UNDO「Application.Undo」。

但し、「Application.Undo」はイベントを発生させてしまうので、
「Application.EnableEvents = False」でイベント取得を無効にしてあげないと
永久ループとなってしまう。
→試しに、これを外して実行してみるとよくわかる(永久ループ)。
  ちなみに永久ループになったら焦らず「Ctrl+Pause」だ!
分類:ExcelVBA