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(アクセス)
-
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
accessでイベントを中止するようなコマンドはあるのでしょうか?
その他(データベース)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
VBA コンボボックスで選んだ値を取得するには
その他(Microsoft Office)
-
6
vba listviewにおけるtextのAlingmentを中央にしたい
Excel(エクセル)
-
7
worksheet_changeがループする
PowerPoint(パワーポイント)
-
8
TEXTBOX_CHANGEのイベント抑制
Visual Basic(VBA)
-
9
名前をつけて保存した後、元のファイルに戻るには
その他(コンピューター・テクノロジー)
-
10
コンボボックス ▼ボタンをクリックしたらイベント
PowerPoint(パワーポイント)
-
11
どこにもフォーカスを当てたくない
Access(アクセス)
-
12
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
13
フォントの大きさ
Visual Basic(VBA)
-
14
エクセルVBA ユーザーフォームのTextBoxを日付にしたい
Excel(エクセル)
-
15
ListViewで複数選択された項目を一度に削除する方法
Visual Basic(VBA)
-
16
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
17
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
18
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
19
Excelのシート上のShapeにイベントは設定できる?
Excel(エクセル)
-
20
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MS Accessでフォームの「開く時...
-
メタルギアソリッド3 独房から...
-
ファイアーエムブレム聖戦の系...
-
VBAから変更した時だけイベント...
-
ミンサガ いきなり四天王と戦...
-
実況パワフルプロ野球2010 マ...
-
Outlook 2016 でメール受信時に...
-
信長の野望大志で金ヶ崎の退き...
-
これってバグ?(FF8/CC団)
-
ドレクエ:現代の海底都市への...
-
FF(7)でエアリスは、どこで死ぬ...
-
テイルズオブヴェスペリアの女...
-
パワプロ2018の五稜郭モードで...
-
TOS クラトスルート
-
アンジェリークデュエットをし...
-
ソリティアは「毎回必ず」クリ...
-
パワプロ2013
-
Windowsゲームのソリテ...
-
マインクラフトの質問です。 エ...
-
写真のようなビニール製の袋の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ミンサガ いきなり四天王と戦...
-
ドレクエ:現代の海底都市への...
-
MS Accessでフォームの「開く時...
-
メタルギアソリッド3 独房から...
-
テイルズオブシンフォニアでゼ...
-
VBAから変更した時だけイベント...
-
ファイアーエムブレム聖戦の系...
-
FF(7)でエアリスは、どこで死ぬ...
-
PCの三国志11で諸葛亮が何度...
-
信長の野望・革新で本能寺の変...
-
DSのルーンファクトリー4とSwit...
-
TOS クラトスルート
-
ロマサガ1のイベントの進め方...
-
これってバグ?(FF8/CC団)
-
FF6 ゾゾ 正直者はどこに?
-
太閤立志伝5おすすめ秀吉にて...
-
FF12の大砂海ナム・エンサ
-
テイルズオブジアビスのミュウ...
-
信長の野望大志で金ヶ崎の退き...
-
「風雨来記」サブキャラ攻略法...
おすすめ情報