
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
-
4
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
5
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
6
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
7
accessでイベントを中止するようなコマンドはあるのでしょうか?
その他(データベース)
-
8
UserForm1.Showでエラーになります。
工学
-
9
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
10
ExcelのComboboxでマウスのスクロールを有効にしたい
Excel(エクセル)
-
11
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
12
VBAのExitイベントについて
その他(プログラミング・Web制作)
-
13
Visual Basic 6.0 コンボボックスのChangeイベントが発生しません
Visual Basic(VBA)
-
14
TEXTBOX_CHANGEのイベント抑制
Visual Basic(VBA)
-
15
VBA プロシージャの名前の取得
その他(Microsoft Office)
-
16
複数選択のListBoxでClickイベントが拾えません
Visual Basic(VBA)
-
17
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
-
18
オブジェクト型の変数にフォームを入れたい
Visual Basic(VBA)
-
19
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
20
ユーザーフォーム、コンボボックスで重複せず選択リストを表示させるには
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ロマサガ1のイベントの進め方...
-
「風雨来記」サブキャラ攻略法...
-
信長の野望・革新で本能寺の変...
-
RPGツクール2000での町の作り方
-
PS ワンピース オーシャン...
-
アンジェリークデュエットをし...
-
砂漠の骨の中のダンジョン…これ...
-
オールドキャッスルへ行くには...
-
テイルズオブデスティニーのサ...
-
ファイナルファンタジー6アド...
-
7匹の蝶を………
-
聖剣伝説レジェンドオブマナ
-
あつもりアップデートしたのに ...
-
学校をつくろう!!校長先生物...
-
信長の野望大志で金ヶ崎の退き...
-
ファイナルファンタジー8(F...
-
闘神都市(2)
-
パワプロ2013 のオリ変の取得条件
-
FF6 ゾゾ 正直者はどこに?
-
パワプロ2018の五稜郭モードで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MS Accessでフォームの「開く時...
-
VBAから変更した時だけイベント...
-
ミンサガ いきなり四天王と戦...
-
ドレクエ:現代の海底都市への...
-
PS3版テイルズオブヴェスペリア...
-
wiiのドラゴンボールzスパーキ...
-
メタルギアソリッド3 独房から...
-
ファイアーエムブレム聖戦の系...
-
PS ワンピース オーシャン...
-
FF(7)でエアリスは、どこで死ぬ...
-
PCの三国志11で諸葛亮が何度...
-
「風雨来記」サブキャラ攻略法...
-
アクセス-オプションボタンのグ...
-
ドラゴンクエスト9 ナザム村...
-
学校をつくろう!!校長先生物...
-
信長の野望・革新で本能寺の変...
-
EnableEventsの意味は
-
これってバグ?(FF8/CC団)
-
Switch『マリオサンシャイン』...
-
テイルズオブエターニアの7大...
おすすめ情報