• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAから変更した時だけイベントを発生させない方法)

VBAでコンボボックスの選択を変更した場合にイベントを発生させない方法

このQ&Aのポイント
  • Excel VBAでコンボボックスの選択を変更した場合にイベントを発生させない方法を知りたいです。VBAのコードからコンボボックスの選択を変更した場合にイベントハンドラが呼び出されないようにするための記述方法を教えてください。
  • Excel VBAのコンボボックスでの選択変更時にイベントを発生させないようにする方法を教えてください。コンボボックスの選択をVBAコードから変更した場合にイベントハンドラが呼び出されないようにするための記述方法を知りたいです。
  • Excel VBAでコンボボックスの選択変更時にイベントハンドラを無効化する方法を教えてください。VBAコードからコンボボックスの選択を変更した場合に、イベントが発生しないようにするためにはどのように記述すれば良いですか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは。 まだ、閉じていない所をみると、満足していないということでしょうか。 ただ、常識的には、ComboBox1.ListIndex = -1 と、ComboBox 側の値を変更しているのですから、Changeイベントは発生します。本来、避けられないことというよりも、以下の部分に疑問が残ります。 問題は、 Private Sub ComboBox1_Change()  '本当は、ここで何をしているのか、何をするのかではないのでしょうか? End Sub この部分が明らかになっていないようです。 何を言いたいかというと、ComboBox1_Changeの選択自体が安易ではなかったのではないか、ということになりますね。おそらく、私なら、ComboBox1_Changeのイベントを他のものに変えていると思います。 ComboBox1_Changeのイベントは、センシティブのような気がします。選択すること自体にイベントが発生していたら、たまったものではないと思うのですが…… ただ、それは私自身の問題になってしまいますから、 その部分で、CommandButtonからのものは排除するという暫定処置を考えます。 ブランクなら、ブランクのIf文を作ればよいです。 '// Private Sub ComboBox1_Change()  If ActiveControl.Name Like "CommandButton*" Then Exit Sub  MsgBox ("ComboBox1_Changeイベント発生") End Sub

yam2012
質問者

お礼

If ActiveControl.Name Like "CommandButton*" Then Exit Sub がすっきりしていていい感じです。 最初、このコードを見た時、CommandButton1_Click()の中のComboBox1.ListIndex = -1 の処理で、ComboBox1_Change()のイベントが発生しているので、ActiveControl.Nameの部分はComboBox1になるのではないかと心配していましたが、実際に確認してみると、CommandButton1になっていて期待通りExitします。 また、この方法で、ユーザーが操作したのか、VBAコードで操作したのか、どちらなのかを知ることもできるので、とても参考になりました。 ありがとうございました。

その他の回答 (2)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

行おうとしていることは、コンボボックスで最終番号を選んだ場合、コマンドボタンを押せば選択状態をクリアするように読めました。 そもそもの話ですが、「Application.EnableEvents = False」で止められるのは、Excelオブジェクトのイベントだけで、Formsオブジェクトのイベントは止めることはできません。コードはいいんですが、機能しないわけです。 EnableEventsを使うという考えを生かすには、以下のようにすれば(フラグを設定する)イベントは実行されないはずです。 机上デバッグです。確認してください。 Option Explicit Dim CancelFlg as Boolean   ’■追加 Private Sub ComboBox1_Change()   If CancelFlg Then Exit Sub           ’■追加   MsgBox ("ComboBox1_Changeイベント発生") End Sub :: :: If index = num - 1 Then ’  Application.EnableEvents = False  ’■コメント   CancelFlg=True              ’■追加   ComboBox1.ListIndex = -1 '<----------(A) ’  Application.EnableEvents = True   ’■コメント   CancelFlg=False              ’■追加 Else : :

yam2012
質問者

お礼

nishi6さん。 やはりフラグなどでの対処ということになりますかね。 暫定対策として、ComboBox1_Change()の中で、ブランクの時は何もしないでそのまま戻るようにしていたのですが、なぜイベントが起きてしまうのかという不思議な思いもあったので、Formsオブジェクトのイベントには使えないということが分かっただけでも質問してよかったです。 ありがとうございました。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.1

 If index = num - 1 Then   Application.EnableEvents = False   ComboBox1.ListIndex = -1 '<----------(A)   Application.EnableEvents = True  Else   ComboBox1.ListIndex = index + 1  End If を  If index <> num - 1 Then   ComboBox1.ListIndex = index + 1  End If のようにすればいいのではないでしょうか。

yam2012
質問者

補足

mar00さん。 回答ありがとうございます。 でもこれだと30の時にブランクにならないという問題があります。

関連するQ&A