- ベストアンサー
エクセル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 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?
- error123
- お礼率78% (156/200)
- オフィス系ソフト
- 回答数6
- ありがとう数6
- みんなの回答 (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 ってのが「引数」なのかな? ありがとうございました。
関連する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
- ベストアンサー
- Excel(エクセル)
- エクセルマクロ(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(エクセル)
- 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列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。
- ベストアンサー
- Excel(エクセル)
- 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文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Windows系OS
お礼
これこそ求めていた答えです。 ありがとうございました。