
Excel VBA で、コンボボックスの選択をユーザーが変更した時はイベントハンドラが呼び出されて処理をしていますが、VBAのコードからコンボボックスの選択を変更した時には、このイベントハンドラが呼び出されないようにしたいのですが、どのように記述すればよいでしょうか。
例えば、下記のコードの (A) の部分で、VBAのコードからコンボボックスの選択を変更していますが、ここでイベントが発生しないようにしたいのですが、Application.EnableEvents = False を記述してもイベントが発生していますがなぜでしょうか。どのように記述すれば (A) の部分でイベントが発生しなくなりますでしょうか。
よろしくお願いします。(Windows7 , Excel2010 )
---Module1----------
Option Explicit
Sub main()
UserForm1.Show
End Sub
---UserForm1--------
Option Explicit
Private Sub UserForm_Initialize()
Dim i As Integer
ComboBox1.Style = fmStyleDropDownList
For i = 1 To 30
ComboBox1.AddItem Format(i, "00")
Next i
End Sub
Private Sub CommandButton1_Click()
Dim num As Integer
Dim index As Integer
num = ComboBox1.ListCount
index = ComboBox1.ListIndex
If index = num - 1 Then
Application.EnableEvents = False
ComboBox1.ListIndex = -1 '<----------(A)
Application.EnableEvents = True
Else
ComboBox1.ListIndex = index + 1
End If
End Sub
Private Sub ComboBox1_Change()
MsgBox ("ComboBox1_Changeイベント発生")
End Sub
------------------------------------
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
If ActiveControl.Name Like "CommandButton*" Then Exit Sub がすっきりしていていい感じです。
最初、このコードを見た時、CommandButton1_Click()の中のComboBox1.ListIndex = -1 の処理で、ComboBox1_Change()のイベントが発生しているので、ActiveControl.Nameの部分はComboBox1になるのではないかと心配していましたが、実際に確認してみると、CommandButton1になっていて期待通りExitします。
また、この方法で、ユーザーが操作したのか、VBAコードで操作したのか、どちらなのかを知ることもできるので、とても参考になりました。
ありがとうございました。
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
:
:
nishi6さん。
やはりフラグなどでの対処ということになりますかね。
暫定対策として、ComboBox1_Change()の中で、ブランクの時は何もしないでそのまま戻るようにしていたのですが、なぜイベントが起きてしまうのかという不思議な思いもあったので、Formsオブジェクトのイベントには使えないということが分かっただけでも質問してよかったです。
ありがとうございました。
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
のようにすればいいのではないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MS Accessでフォームの「開く時...
-
ミンサガ いきなり四天王と戦...
-
テイルズオブデスティニーのサ...
-
パワプロ2013 のオリ変の取得条件
-
VBAから変更した時だけイベント...
-
遊戯王タッグフォース2で
-
写真のようなビニール製の袋の...
-
ソリティアは「毎回必ず」クリ...
-
パワプロ2013
-
テイルズオブジアビスの称号「...
-
EN-528について
-
サイレン 終了条件2とは?
-
ドラクエ9 オンゴリの崖の行き方
-
FF10クリア後のセーブについて
-
ゲーム シュタインズゲートのC...
-
ゼノギアスのエンディングについて
-
トゥルーステージさんの運営す...
-
powershell ISEをインストール...
-
幻想水滸伝1の戦死
-
妖怪ウォッチ真打、クエストが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MS Accessでフォームの「開く時...
-
ドレクエ:現代の海底都市への...
-
VBAから変更した時だけイベント...
-
ミンサガ いきなり四天王と戦...
-
ファイアーエムブレム聖戦の系...
-
太閤立志伝5おすすめ秀吉にて...
-
PS3版テイルズオブヴェスペリア...
-
Switch『マリオサンシャイン』...
-
wiiのドラゴンボールzスパーキ...
-
FF6 ゾゾ 正直者はどこに?
-
PCの三国志11で諸葛亮が何度...
-
「風雨来記」サブキャラ攻略法...
-
EnableEventsの意味は
-
PS ワンピース オーシャン...
-
VBAでeventlogを取得したい
-
メタルギアソリッド3 独房から...
-
アクセス-オプションボタンのグ...
-
メダロット2『ぎんのロケット...
-
ときめきメモリアル「藤崎詩織...
-
テイルズオブシンフォニアでゼ...
おすすめ情報