/ / Nie można zatrzymać zdarzenia Combobox_Change VBA wyzwalającego kolejne zdarzenie Combobox_Change - excel, vba, excel-vba

Nie można zatrzymać zdarzenia Combobox_Change VBA wyzwalającego kolejne zdarzenie Combobox_Change - excel, vba, excel-vba

Ten mnie przyłapał - mam formularz z trzema comboboxami i są to:

wprowadź opis obrazu tutaj

Umbrella_Dropdown: Wyzwalacz Umbrella_Dropdown_Change nie zmienia wartości w dwóch pozostałych comboboxach, ale zmienia wymieniony element w nich (tak aby nie wyzwolił _change wydarzenie w dwóch pozostałych (nie przejmuj się deklaracjami - są one zadeklarowane na poziomie globalnym):

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: Wyzwalacz MCH_Dropdown_Change zmienia wartości pozostałych dwóch comboboxów i mimo, że jestem włączony Application.enableEvents = False tuż przed zmianą wartości, ale nie wydaje się, aby zrobić lewę i odpala zdarzenia Umbrella_Dropdown_Change i 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

To samo można powiedzieć oFund_Name_Dropdown_Change zdarzenie wyzwalające pozostałe (i, chociaż przeszedłem tylko przez mój kod, widzę, że spowodowałoby to nieskończoną "pętlę", w której FundName_Dropdown_Change wyzwala MCH_Dropdown_Change, co spowodowałoby zmianę nazwy na Fund_Name_Dropdown_Cange itd. Na koniec czasu ..)

W każdym razie, na wypadek, gdybyś chciał zobaczyć kod dla zdarzenia Fund_Name_Dropdown_Change, to jest to:

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

Co mogę zrobić, aby wyłączyć wyzwalacze ?! Jeśli potrzebujesz dodatkowych informacji, daj mi znać, ale myślę, że wszystko spisałem.

Z góry dziękuję

Odpowiedzi:

1 dla odpowiedzi № 1

Application.EnableEvents nie ma większego wpływu na obiekty UserForm, głównie. (tylko zabezpieczam moje oświadczenie, aby ludzie nie dawali mi przykładów)

Potrzebna jest zmienna o zakresie formularza (najlepszym sposobem jest dodanie niestandardowej właściwości) do przechowywania i manipulowania stanem zdarzenia formularza.

Zobacz ten przykład i przerób swój kod w następujący sposób:

"/ 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