/ / Combobox_Changeイベントを停止できませんVBA別のCombobox_Changeイベントをトリガする - excel、vba、excel-vba

Combobox_ChangeイベントVBAが別のCombobox_Changeイベントをトリガーするのを停止できません - excel、vba、excel-vba

これは私を捕まえました - 私はそれに3つのコンボボックスを持つフォームを持っています:

ここに画像の説明を入力

Umbrella_Dropdown: Umbrella_Dropdown_Changeトリガーは、他の2つのコンボボックス内の値を変更しませんが、その中のリストされた項目を変更します(したがって、 _change 他の2つのイベント(宣言について心配しないでください - グローバルレベルで宣言しています):

Private Sub Umbrella_Dropdown_Change()

If Fund_Temination.Umbrella_Dropdown.ListIndex = -1 And Fund_Temination.Umbrella_Dropdown.Value <> "" Then
MsgBox "Please select from drop-down", vbInformation, "Select from drop-down"
Fund_Temination.Umbrella_Dropdown.Value = ""
Exit Sub
End If

sString = Umbrella_Dropdown.Value
l = 2
Fund_Temination.Fund_Name_Dropdown.Clear
Fund_Temination.MCH_Dropdown.Clear

Do Until l > WorksheetFunction.Max(Sheets("List of current funds").Range("C1048576").End(xlUp).Row, Sheets("List of current funds").Range("A1048576").End(xlUp).Row)
If sString = "" Then
If Trim(Sheets("List of current funds").Range("C" & l).Value) <> "" And Trim(Sheets("List of current funds").Range("A" & l).Value) <> "" Then
Fund_Temination.Fund_Name_Dropdown.AddItem Sheets("List of current funds").Range("C" & l).Value
Fund_Temination.MCH_Dropdown.AddItem Sheets("List of current funds").Range("A" & l).Value
End If
Else
If Trim(Sheets("List of current funds").Range("C" & l).Value) <> "" And Trim(Sheets("List of current funds").Range("B" & l).Value) = sString And Trim(Sheets("List of current funds").Range("A" & l).Value) <> "" Then
Fund_Temination.Fund_Name_Dropdown.AddItem Sheets("List of current funds").Range("C" & l).Value
Fund_Temination.MCH_Dropdown.AddItem Sheets("List of current funds").Range("A" & l).Value
End If
End If
l = l + 1
Loop

sString = ""

End Sub

MCH_Dropdown: MCH_Dropdown_Changeトリガーは他の2つのコンボボックスの値を変更しますが、 Application.enableEvents = False Umbrella_Dropdown_ChangeイベントとFund_Name_Dropdown_Changeイベントのトリックを実行していないようです。

Private Sub MCH_Dropdown_Change()

If Len(Fund_Temination.MCH_Dropdown.Value) = 4 Then
If Not Fund_Temination.MCH_Dropdown.ListIndex = -1 Then
l = 1
Do Until l > WorksheetFunction.Max(Sheets("List of current funds").Range("C1048576").End(xlUp).Row, Sheets("List of current funds").Range("A1048576").End(xlUp).Row)
If Sheets("List of current funds").Range("A" & l).Value = Fund_Temination.MCH_Dropdown.Value Then
Application.EnableEvents = False
Fund_Temination.Fund_Name_Dropdown.Value = Sheets("List of current funds").Range("C" & l).Value
Fund_Temination.Umbrella_Dropdown.Value = Sheets("List of current funds").Range("B" & l).Value
Application.EnableEvents = True
GoTo Finish
End If
l = l + 1
Loop
Else
MsgBox "The MCH entered is not listed in the dropdown" & vbNewLine & vbNewLine & "Please re-enter the correct MCH or select from the dropdown", vbCritical, "Wrong MCH code entered"
Fund_Temination.MCH_Dropdown.Value = ""
End If
End If

Finish:

End Sub

同じことがFund_Name_Dropdown_Changeイベントは他のものをトリガーします(私のコードを踏んだだけですが、Fund_Name_Dropdown_ChangeがFund_Name_Dropdown_ChangeをトリガーするMCH_Dropdown_Changeをトリガする無限ループが発生することがわかります)

とにかく、Fund_Name_Dropdown_Changeイベントのコードを見たい場合は、次のようにします:

Private Sub Fund_Name_Dropdown_Change()

If Not Fund_Temination.Fund_Name_Dropdown.ListIndex = -1 Then
l = 1
Do Until l > WorksheetFunction.Max(Sheets("List of current funds").Range("C1048576").End(xlUp).Row, Sheets("List of current funds").Range("A1048576").End(xlUp).Row)
If Sheets("List of current funds").Range("C" & l).Value = Fund_Temination.Fund_Name_Dropdown.Value Then
Application.EnableEvents = False
Fund_Temination.MCH_Dropdown.Value = Sheets("List of current funds").Range("A" & l).Value
Fund_Temination.Umbrella_Dropdown.Value = Sheets("List of current funds").Range("B" & l).Value
Application.EnableEvents = True
GoTo Finish
End If
l = l + 1
Loop
End If

Finish:

End Sub

トリガーをオフにするにはどうしたらいいですか? さらに詳しい情報が必要なら私に知らせてください。しかし、私はすべてをリストアップしたと思います。

前もって感謝します

回答:

回答№1は1

Application.EnableEvents 主にUserFormオブジェクトに影響を及ぼしません(私のステートメントをヘッジするだけで、人々は私に例を与えることを始めません)

あなたが必要とするのは、フォームのスコープ付き変数です(フォームのイベント状態を格納して操作するために、カスタムプロパティを追加するのが最善の方法です)。

この例を見て、これに沿ってコードを再作成してください:

"/ UserForm with 2 CheckBoxes :  CheckBox1 and  CheckBox2
Private m_bEvents         As Boolean

Public Property Let EnableFormEvents(bVal As Boolean)
m_bEvents = bVal
End Property

Public Property Get EnableFormEvents() As Boolean
EnableFormEvents = m_bEvents
End Property

Private Sub CheckBox1_Click()

"/ Custom Event Status

Me.EnableFormEvents = False
Me.CheckBox2 = Me.CheckBox1
Me.EnableFormEvents = True

End Sub

Private Sub CheckBox2_Click()

If Me.EnableFormEvents Then
MsgBox "Check box clicked by user."
Else
MsgBox "Check box clicked by code."
End If
End Sub