Ten mnie przyłapał - mam formularz z trzema comboboxami i są to:
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 № 1Application.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