• ベストアンサー

エクセルVBAで Cancel=Trueの使い方

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_Deactivate() Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cancel = True MsgBox "キャンセルしました" End Sub 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

> セルへの入力を取り消す場合でいいです。 > たとえば、A1に5と入っていたのに3を入力されたので、5(というか以前の値)にもどす。 それでしたらこれが一番簡単な方法ではないでしょうか?3が入力されたらUndoしちゃうんです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = 3 Then Application.Undo 'MsgBox "キャンセルしました" End If End Sub

error123
質問者

お礼

これこそ求めていた答えです。 ありがとうございました。

その他の回答 (5)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.6

No5shishishishi殿 そうか、Undoがありましたね。 思い出させてくれて感謝します。 これからも目から鱗の回答期待しております。 それから、この質問あってのこと、 ということでerror123さんにも感謝せねば。

error123
質問者

お礼

> ということでerror123さんにも感謝せねば。 あははは。 質問して感謝されちゃった♪

  • taocat
  • ベストアンサー率61% (191/310)
回答No.4

こんばんは。 簡単の為に、 A1に、3を入力したらそれをキャンセルして、 A1の値を元に戻すコードです。 Option Explicit Dim W Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then If Target.Value = 3 Then MsgBox "3は入力禁止。キャンセルします" Application.EnableEvents = False Target.Value = W Target.Activate Application.EnableEvents = True End If End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then W = Target.Value End If End Sub   上記のコードをSheet1(どのSheetでも可)のモジュールにコピペし、 (1)先ず、A1に、3以外の数字を入力 (2)次に、3を入力すると「3は禁止」のメッセージ (3)その後、A1の値が元に戻る   こんなんでええですか?  

error123
質問者

お礼

ありがとうございました。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.3

おはようござりまする。 >Worksheet_Changeイベントをキャンセルするには >どのようにコーディングしなければならないのでしょうか? ただ単にWorksheet_Changeイベントをキャンセルするコードと言われても、意図するキャンセルの動作が具体的に分からないとコーティングはできませぬ。 例えば、 どのセルに対して、どういった条件の時に、 また、単に入力値を取り消すだけでいいのか等々、

error123
質問者

補足

お返事ありがとうございます♪ セルへの入力を取り消す場合でいいです。 たとえば、A1に5と入っていたのに3を入力されたので、5(というか以前の値)にもどす。 よろしくお願いしま~す。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

snoopy64さんの回答にちょと補足しますと。 例を挙げるとブックを閉じる(×ボタン等)前には 下記のイベントが発生するわけですが、 引数を見てみると、Cancelがありますよね。 こういう場合に、Cancel=Trueが使えるわけです。 下記のコードをThisWorkbookに貼り付けて ブックの閉じるボタン(×)をクリックしてみてください。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) MsgBox "×ボタンが押されましたが、その動作をキャンセルします" Cancel = True End Sub で、質問のように引数にCancelがない場合は その動作を自分でコーディングしなければなりません。 それから、老婆心で一言。 変数の宣言は必ずするようにしましょう。 Option Explicitステートメントは必須です。 これがあれば、CANCEL=TRUE、のところで 変数未定義のエラーが発生し質問も別なもの になったかも知れませんね。 以上。

error123
質問者

お礼

> 引数を見てみると、Cancelがありますよね。 > こういう場合に、Cancel=Trueが使えるわけです。 大変良くわかりました♪ > で、質問のように引数にCancelがない場合は > その動作を自分でコーディングしなければなりません。 そうなんですか。では、たとえばWorksheet_Changeイベントをキャンセルするにはどのようにコーディングしなければならないのでしょうか?

  • snoopy64
  • ベストアンサー率42% (337/793)
回答No.1

キャンセルできるイベントとできないイベントがあって、できるイベントでは引数にCancelがあります。 ・・・って理解してます。

error123
質問者

お礼

な~るほど! Cancel As Boolean ってのが「引数」なのかな? ありがとうございました。

関連するQ&A