- ベストアンサー
エクセル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 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> セルへの入力を取り消す場合でいいです。 > たとえば、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
その他の回答 (5)
- taocat
- ベストアンサー率61% (191/310)
No5shishishishi殿 そうか、Undoがありましたね。 思い出させてくれて感謝します。 これからも目から鱗の回答期待しております。 それから、この質問あってのこと、 ということでerror123さんにも感謝せねば。
お礼
> ということでerror123さんにも感謝せねば。 あははは。 質問して感謝されちゃった♪
- taocat
- ベストアンサー率61% (191/310)
こんばんは。 簡単の為に、 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の値が元に戻る こんなんでええですか?
お礼
ありがとうございました。
- taocat
- ベストアンサー率61% (191/310)
おはようござりまする。 >Worksheet_Changeイベントをキャンセルするには >どのようにコーディングしなければならないのでしょうか? ただ単にWorksheet_Changeイベントをキャンセルするコードと言われても、意図するキャンセルの動作が具体的に分からないとコーティングはできませぬ。 例えば、 どのセルに対して、どういった条件の時に、 また、単に入力値を取り消すだけでいいのか等々、
補足
お返事ありがとうございます♪ セルへの入力を取り消す場合でいいです。 たとえば、A1に5と入っていたのに3を入力されたので、5(というか以前の値)にもどす。 よろしくお願いしま~す。
- taocat
- ベストアンサー率61% (191/310)
snoopy64さんの回答にちょと補足しますと。 例を挙げるとブックを閉じる(×ボタン等)前には 下記のイベントが発生するわけですが、 引数を見てみると、Cancelがありますよね。 こういう場合に、Cancel=Trueが使えるわけです。 下記のコードをThisWorkbookに貼り付けて ブックの閉じるボタン(×)をクリックしてみてください。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) MsgBox "×ボタンが押されましたが、その動作をキャンセルします" Cancel = True End Sub で、質問のように引数にCancelがない場合は その動作を自分でコーディングしなければなりません。 それから、老婆心で一言。 変数の宣言は必ずするようにしましょう。 Option Explicitステートメントは必須です。 これがあれば、CANCEL=TRUE、のところで 変数未定義のエラーが発生し質問も別なもの になったかも知れませんね。 以上。
お礼
> 引数を見てみると、Cancelがありますよね。 > こういう場合に、Cancel=Trueが使えるわけです。 大変良くわかりました♪ > で、質問のように引数にCancelがない場合は > その動作を自分でコーディングしなければなりません。 そうなんですか。では、たとえばWorksheet_Changeイベントをキャンセルするにはどのようにコーディングしなければならないのでしょうか?
- snoopy64
- ベストアンサー率42% (337/793)
キャンセルできるイベントとできないイベントがあって、できるイベントでは引数にCancelがあります。 ・・・って理解してます。
お礼
な~るほど! Cancel As Boolean ってのが「引数」なのかな? ありがとうございました。
お礼
これこそ求めていた答えです。 ありがとうございました。