dポイントプレゼントキャンペーン実施中!

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

A 回答 (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
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。
外部から値が変わった時と、使用者が直接チェックボックスを操作した時で
場合分けしたかったので、まさしくこのような挙動をイメージしていました。
たしかに直接操作したかどうかはフォーカスの有無で判断できるかな?とは思ったのですが、
ActiveControlの使い方を知らなくて行き詰まっていました。
教えていただいたソースをうまく組み込んでみようと思います。

お礼日時:2017/02/09 08:58

こちらで動作確認しました。


「CheckBox.Value」が False → True へ変わるとき、そして True → False へ変わるときも
1.Private Sub CheckBox_Change()
2.Private Sub CheckBox_Click()
の順でイベントが発生しますね。

仕様がそのようになっています。
CheckBox の チェック状態を何に利用しようとしているのか?
(おそらくTextBoxに変更があったことを残す?)
CheckBoxの チェック(またはClick)によって、何をしたいのか?
を示せば、対応可能な(打開策を提案してくれる?)回答者もたくさんいますよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やはり仕様なんですね…。勘違いしてしまいそうなので、
チェックボックスにClickのイベントを使用するのは避けようと思います。

具体的にマクロでやりたいことですが、
まずエクセルのシートをデータベースとして使っていまして、
それらのセルのデータを読み取って、各オブジェクトの値に格納していくことで
前回ユーザーフォームで使用者が操作した状態を復元することを考えています。

チェックボックスは、各オブジェクトの挙動を変えるオプションのような項目として
使っていまして、使用者が任意にClickでFalseからTrueに切り替えたときだけ、
「このオプションはAの代わりにBを行うようにします。よろしいですか?」
といった確認メッセージを表示させたかったのですが、
Initializeなどで前述の状態の復元を行って、
チェックボックスを直接Trueにした場合であってもその都度確認メッセージが
実行されてしまっていたので、それが冗長に感じたという経緯でした。

テキストボックスからも間接的にチェックボックスを制御したいと考え、
CheckBox_Clickのプロシージャでコードを組み立てたところ
このような挙動が発覚しましたので、
セルから値を読み取り~といったあまり関係なさそうなくだりは抜きにしまして、
最小限のオブジェクトだけを配置したユーザーフォームを作ってみましたら
やはり同じような挙動になってしまったため、
それをそのまま質問用のソースとして使わせていただきました。

お礼日時:2017/02/09 08:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A