![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
エクセルのマクロを作成中なのですが、
チェックボックスのTrue/Falseを他のプロシージャから直接変更すると、
clickのイベントに設定してあるはずのプロシージャが反応してしまいます。
本来、そういった操作で反応するのはchangeのイベントだと認識しているため、
意図しない挙動になってしまって困っています。何が原因でしょうか?
エクセルのバージョンは2013、VBAのバージョンは7.1です。
以下ソース
(ユーザーフォームにテキストボックス「TextBox」とチェックボックス「CheckBox」を配置)
テキストボックスに何かを入力するとチェックボックスをTrueにしますが、
そうするとCheckBox_Clickでないと表示されないはずのメッセージボックスが出てしまいます。
Private Sub TextBox_Change()
Me.CheckBox = True
End Sub
Private Sub CheckBox_Click()
MsgBox "test"
End Sub
![「(VBA)チェックボックスのclickの」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/c/542489022_589abab9acf8d/M.png)
No.2ベストアンサー
- 回答日時:
こんばんは。
>他のプロシージャから直接変更すると、
このように、ActiveControl で、回避すればよいと思います。
If ActiveControl.Name = CheckBox1.Name Then
なお、私なら、このようにしていると思います。TextBox が空なら、CheckBox もオフになるということです。意味が違っていたら、ご指摘ください。
Private Sub TextBox_Change()
If Me.TextBox.Text <> "" Then
Me.CheckBox.Value = 1
Else
Me.CheckBox.Value = 0
End If
End Sub
Private Sub CheckBox_Click()
'直接処理しないと、MsgBox は働かない。
If ActiveControl.Name = CheckBox.Name Then
MsgBox "Test"
End If
End Sub
ご回答ありがとうございます。
外部から値が変わった時と、使用者が直接チェックボックスを操作した時で
場合分けしたかったので、まさしくこのような挙動をイメージしていました。
たしかに直接操作したかどうかはフォーカスの有無で判断できるかな?とは思ったのですが、
ActiveControlの使い方を知らなくて行き詰まっていました。
教えていただいたソースをうまく組み込んでみようと思います。
No.1
- 回答日時:
こちらで動作確認しました。
「CheckBox.Value」が False → True へ変わるとき、そして True → False へ変わるときも
1.Private Sub CheckBox_Change()
2.Private Sub CheckBox_Click()
の順でイベントが発生しますね。
仕様がそのようになっています。
CheckBox の チェック状態を何に利用しようとしているのか?
(おそらくTextBoxに変更があったことを残す?)
CheckBoxの チェック(またはClick)によって、何をしたいのか?
を示せば、対応可能な(打開策を提案してくれる?)回答者もたくさんいますよ。
ご回答ありがとうございます。
やはり仕様なんですね…。勘違いしてしまいそうなので、
チェックボックスにClickのイベントを使用するのは避けようと思います。
具体的にマクロでやりたいことですが、
まずエクセルのシートをデータベースとして使っていまして、
それらのセルのデータを読み取って、各オブジェクトの値に格納していくことで
前回ユーザーフォームで使用者が操作した状態を復元することを考えています。
チェックボックスは、各オブジェクトの挙動を変えるオプションのような項目として
使っていまして、使用者が任意にClickでFalseからTrueに切り替えたときだけ、
「このオプションはAの代わりにBを行うようにします。よろしいですか?」
といった確認メッセージを表示させたかったのですが、
Initializeなどで前述の状態の復元を行って、
チェックボックスを直接Trueにした場合であってもその都度確認メッセージが
実行されてしまっていたので、それが冗長に感じたという経緯でした。
テキストボックスからも間接的にチェックボックスを制御したいと考え、
CheckBox_Clickのプロシージャでコードを組み立てたところ
このような挙動が発覚しましたので、
セルから値を読み取り~といったあまり関係なさそうなくだりは抜きにしまして、
最小限のオブジェクトだけを配置したユーザーフォームを作ってみましたら
やはり同じような挙動になってしまったため、
それをそのまま質問用のソースとして使わせていただきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) エクセルVBAでチェックボックスにチェックを入れる 1 2022/09/14 00:52
- Visual Basic(VBA) シートを選択して、1つのPDFにしたいのですが。 5 2022/10/03 20:18
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Excel(エクセル) 【マクロ】リボン、行列、数式・ステータスバを非表示に 4 2022/12/12 07:32
- Visual Basic(VBA) モードレスでユーザーフォームが開け(表示)ません。 4 2022/09/09 11:05
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
【VBA】シート上の複数のチェックボックスのうちどれか一つでも変更した場合のイベント
Visual Basic(VBA)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
-
4
Excel VBA 動的に作成したチェックボックスにイベントを追加したい
Excel(エクセル)
-
5
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
6
ClickとChangeイベントの違いはどこにあるの。
Visual Basic(VBA)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい
Visual Basic(VBA)
-
9
vba Listviewでのチェックボックスのイベントを教えてください
Excel(エクセル)
-
10
Excel VBAでCheckboxの名前を変数にとって値を調べたい
Visual Basic(VBA)
-
11
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
12
エクセルVBAでチェックボックスにチェックを入れる
Excel(エクセル)
-
13
VBAでセルをクリックする回数で表示が変わる
その他(プログラミング・Web制作)
-
14
エクセルVBA/マルチページ/ページ切り替え時
Access(アクセス)
-
15
エクセルVBAでマルチページの切り替え方法の件で
Excel(エクセル)
-
16
ListViewの行選択について
Visual Basic(VBA)
-
17
TextBoxコントロールを引数として渡すには?
その他(教育・科学・学問)
-
18
ListBoxで改行したい
Visual Basic(VBA)
-
19
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
20
エクセルファイルを自身のファイルで削除する方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タブキー押下時のイベントをひ...
-
ユーザーフォームのテキストボ...
-
VB.NETのDropDownListをReadOnl...
-
【VB】タブ切り替え時のイベント
-
複数のテキストボックスのカン...
-
EXCEL VBA でIEを制御して、INP...
-
コンボボックスにキー入力をさ...
-
コマンドボタン(入力)をクリッ...
-
VB6で電卓を作っているのですが...
-
KEYPREVIEW=TRUEについて。意味...
-
【Mouse Down】キーリピートを...
-
特定のキーを押すまでループさ...
-
ListViewで、PageDownキーイベ...
-
javascript スムーズな動作
-
WPFでの時刻入力コントロールに...
-
Excel VBA マクロ実行中のみテンキ...
-
Access データ表示 完了時のイ...
-
EXCEL VBA----ユーザーフォーム...
-
SelectionChangeCommitted
-
VB.NETでフォームがない...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB】タブ切り替え時のイベント
-
特定のキーを押すまでループさ...
-
一定時間操作されないと自動で...
-
Visual Basic 6.0 コンボボック...
-
タブキー押下時のイベントをひ...
-
WPFでの時刻入力コントロールに...
-
コンボボックスにキー入力をさ...
-
(VBA)チェックボックスのclick...
-
VB.NETのDropDownListをReadOnl...
-
Excel VBA マクロ実行中のみテンキ...
-
EXCEL VBA でIEを制御して、INP...
-
キーイベントを擬似的に発生さ...
-
KEYPREVIEW=TRUEについて。意味...
-
テキストボックスの入力文字を1...
-
VB.NETでフォームがない...
-
エクセルVBAのテキストボック、...
-
IEで、BackSpaceで「戻る」機能...
-
C# WMPメディアの終了検知 その2
-
複数のテキストボックスのカン...
-
コマンドボタン(入力)をクリッ...
おすすめ情報