• ベストアンサー

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

  • エクセル デバッグできるのとできないのがある

    シートイベントについて教えてください。 シートモジュールに --------------------------------------------------------- Option Explicit Private Sub Worksheet_Activate() MsgBox "" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "" End Sub Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "" End Sub --------------------------------------------------------- と記載した時に、 F8で動かせるのは、Worksheet_Activateだけなのですがなぜでしょうか? ほかのイベントは、F8で実行させても、OSの音が鳴るだけで、マクロの実行はされません。 ご回答よろしくお願いします。

  • エクセルvba  (ByVal Target As Range)について

    シートのイベントプロシージャーが Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub となりますが (ByVal Target As Range)部分は何なのでしょうか? 何のためにあるのかわかりません。 Private Sub Worksheet_SelectionChange() End Sub としたらエラーが返ってきました。 理由を教えてください。 よろしくお願いします。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • Excel VBAで変数が定義されていません。

    このシートコードで「変数が定義されていません。」となります。どうすればいいでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Select Case Target.Address Case "$C$10:$C$13" SendKeys "%{DOWN}" Case "$H$10:$H$13" SendKeys "%{DOWN}" Case Else Exit Sub End Select Cancel = True End Sub

  • エクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

    VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー トの中のどのセルを変化させてもマクロが実行されるのですが、これ を、A1とc1とc2が変化したときだけ処理を実行させたいのです。 以下のマクロのどこかを編集すると、そのようなことが出来るのでし ょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) ----実行する内容---- End Sub Private Sub Worksheet_Change(ByVal Target As Range) ----実行する内容---- End Sub

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • Excel VBA イベントプロシージャを2つ記述する(基本です)

    基本的な事なのですが、Excelのイベントプロシージャで2つプログラムを作るにはどうやって記述すればよいのでしょうか? 具体的には、worksheetのchangeイベントで、セルC5の値を変えた時と、セルG7の値を変えた時の2通りのマクロを作成したいのです。 Private Sub Worksheet_Change(ByVal Target As Range) C5を変えた時の処理 End Sub Private Sub Worksheet_Change(ByVal Target As Range) G7を変えた時の処理 End Sub このように書けばよいのでしょうか?そうするとTargetがかぶっておかしくなる気がします。。 お願いします。

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

専門家に質問してみよう