- ベストアンサー
VBAでコンボボックスの選択を変更した場合にイベントを発生させない方法
- Excel VBAでコンボボックスの選択を変更した場合にイベントを発生させない方法を知りたいです。VBAのコードからコンボボックスの選択を変更した場合にイベントハンドラが呼び出されないようにするための記述方法を教えてください。
- Excel VBAのコンボボックスでの選択変更時にイベントを発生させないようにする方法を教えてください。コンボボックスの選択をVBAコードから変更した場合にイベントハンドラが呼び出されないようにするための記述方法を知りたいです。
- Excel VBAでコンボボックスの選択変更時にイベントハンドラを無効化する方法を教えてください。VBAコードからコンボボックスの選択を変更した場合に、イベントが発生しないようにするためにはどのように記述すれば良いですか。
- みんなの回答 (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
その他の回答 (2)
- nishi6
- ベストアンサー率67% (869/1280)
行おうとしていることは、コンボボックスで最終番号を選んだ場合、コマンドボタンを押せば選択状態をクリアするように読めました。 そもそもの話ですが、「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 : :
お礼
nishi6さん。 やはりフラグなどでの対処ということになりますかね。 暫定対策として、ComboBox1_Change()の中で、ブランクの時は何もしないでそのまま戻るようにしていたのですが、なぜイベントが起きてしまうのかという不思議な思いもあったので、Formsオブジェクトのイベントには使えないということが分かっただけでも質問してよかったです。 ありがとうございました。
- mar00
- ベストアンサー率36% (158/430)
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 のようにすればいいのではないでしょうか。
補足
mar00さん。 回答ありがとうございます。 でもこれだと30の時にブランクにならないという問題があります。
お礼
If ActiveControl.Name Like "CommandButton*" Then Exit Sub がすっきりしていていい感じです。 最初、このコードを見た時、CommandButton1_Click()の中のComboBox1.ListIndex = -1 の処理で、ComboBox1_Change()のイベントが発生しているので、ActiveControl.Nameの部分はComboBox1になるのではないかと心配していましたが、実際に確認してみると、CommandButton1になっていて期待通りExitします。 また、この方法で、ユーザーが操作したのか、VBAコードで操作したのか、どちらなのかを知ることもできるので、とても参考になりました。 ありがとうございました。