こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル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

以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。
どこが間違っているのでしょうか?

投稿日時 - 2004-11-04 13:49:43

QNo.1069509

困ってます

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

> セルへの入力を取り消す場合でいいです。
> たとえば、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

投稿日時 - 2004-11-06 02:25:17

お礼

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

投稿日時 - 2004-11-06 22:23:20

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

No5shishishishi殿

そうか、Undoがありましたね。
思い出させてくれて感謝します。
これからも目から鱗の回答期待しております。

それから、この質問あってのこと、
ということでerror123さんにも感謝せねば。

投稿日時 - 2004-11-06 07:34:32

お礼

> ということでerror123さんにも感謝せねば。

あははは。
質問して感謝されちゃった♪

投稿日時 - 2004-11-06 22:24:32

ANo.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の値が元に戻る
 

こんなんでええですか?
 

投稿日時 - 2004-11-05 20:23:58

お礼

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

投稿日時 - 2004-11-06 22:22:23

ANo.3

おはようござりまする。

>Worksheet_Changeイベントをキャンセルするには
>どのようにコーディングしなければならないのでしょうか?

ただ単にWorksheet_Changeイベントをキャンセルするコードと言われても、意図するキャンセルの動作が具体的に分からないとコーティングはできませぬ。

例えば、
どのセルに対して、どういった条件の時に、
また、単に入力値を取り消すだけでいいのか等々、

投稿日時 - 2004-11-05 07:21:07

補足

お返事ありがとうございます♪

セルへの入力を取り消す場合でいいです。
たとえば、A1に5と入っていたのに3を入力されたので、5(というか以前の値)にもどす。

よろしくお願いしま~す。

投稿日時 - 2004-11-05 10:48:32

ANo.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、のところで
変数未定義のエラーが発生し質問も別なもの
になったかも知れませんね。
以上。

投稿日時 - 2004-11-04 15:25:55

お礼

> 引数を見てみると、Cancelがありますよね。
> こういう場合に、Cancel=Trueが使えるわけです。

大変良くわかりました♪

> で、質問のように引数にCancelがない場合は
> その動作を自分でコーディングしなければなりません。

そうなんですか。では、たとえばWorksheet_Changeイベントをキャンセルするにはどのようにコーディングしなければならないのでしょうか?

投稿日時 - 2004-11-04 16:36:35

ANo.1

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

投稿日時 - 2004-11-04 13:54:08

お礼

な~るほど!

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

投稿日時 - 2004-11-04 16:31:53

あなたにオススメの質問