
エクセルのマクロを作成中なのですが、
チェックボックスの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

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を複数作成し、同BOXにイベントを追加したい
Visual Basic(VBA)
-
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
-
4
ClickとChangeイベントの違いはどこにあるの。
Visual Basic(VBA)
-
5
2つのマクロでチェックボックスが連動しません
Visual Basic(VBA)
-
6
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
7
UserForm1.Showでエラーになります。
工学
-
8
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
9
エクセルVBAでチェックボックスにチェックを入れる
Excel(エクセル)
-
10
VBA。複数のChangeイベントをまとめる方法
Visual Basic(VBA)
-
11
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
12
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
13
CheckBoxの配列化
Access(アクセス)
-
14
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
15
エクセルでObjectがあるセル番地を取得するマクロは?
Excel(エクセル)
-
16
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
17
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
18
Excel VBAでCheckboxの名前を変数にとって値を調べたい
Visual Basic(VBA)
-
19
なぜエラーになるのでしょう?アクティブコントロール
その他(Microsoft Office)
-
20
エクセル VBA CheckBox名に変数を使用
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンボボックス選択後に非アク...
-
イベントハンドラが取得できな...
-
矢印キーイベントの封印。
-
【Mouse Down】キーリピートを...
-
WPFでの時刻入力コントロールに...
-
【VB】タブ切り替え時のイベント
-
テキストボックスの入力文字を1...
-
delphi imageコンポでOnKeyイベ...
-
ListViewで、PageDownキーイベ...
-
ショートカットキーの変更をしたい
-
GetKeyStateについて
-
Objective-Cでキーボードイベン...
-
一定時間操作されないと自動で...
-
ユーザーフォームのテキストボ...
-
KEYPREVIEW=TRUEについて。意味...
-
特定のキーを押すまでループさ...
-
VB.NETのDropDownListをReadOnl...
-
フォーカスについてお教えください
-
onchangeでイベントが発生しません
-
Delphiでキー入力を投げたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB】タブ切り替え時のイベント
-
タブキー押下時のイベントをひ...
-
(VBA)チェックボックスのclick...
-
VB.NETでフォームがない...
-
特定のキーを押すまでループさ...
-
一定時間操作されないと自動で...
-
コンボボックスにキー入力をさ...
-
Visual Basic 6.0 コンボボック...
-
VB.NETのDropDownListをReadOnl...
-
WPFでの時刻入力コントロールに...
-
KEYPREVIEW=TRUEについて。意味...
-
Excel VBA マクロ実行中のみテンキ...
-
フォーカスについてお教えください
-
エクセルVBAのテキストボック、...
-
DirectXのDIK発進について
-
Enterキー入力後の動作について
-
C# WMPメディアの終了検知 その2
-
Delphiでキー入力を投げたい
-
キーイベントを擬似的に発生さ...
-
DephiでのTextボックスでの数値...
おすすめ情報