在 VBA 中(在 Excel 中),区分列表框以编程方式更改与单击时更改
In VBA (in Excel), differentiating between a listbox changing programatically vs. on click
我在 VBA Excel 的用户表单中有两个多 select 列表框。
一个包含国家,另一个包含城市。
如果用户单击 selects/deselects 一个国家,我希望我的脚本自动 select/deselect 第二个列表框中位于该国家/地区的所有城市。
同样,我希望如果用户单击并 selects/deselects 一个城市,它会自动更新第一个列表框以仅突出显示其所有相应城市目前都已 select 的国家。
我的问题是:
通过使用 OnChange 事件(OnClick 不适用于多个 select 列表框),每次更改其中一个列表框时,它都会更改另一个。
在此上下文中,这意味着任何时候更改一个国家/地区都会更改第二个列表框中的所有相应城市 - 对于每个国家/地区,用户实际上被限制为 select 所有城市或 none.
是否可以判断列表框是被用户更改还是被脚本更改?如果没有,是否存在可以满足我的目标的替代方法?
感谢您的阅读。
Application.EnableEvents 对 UserForm 对象没有影响。
您需要一个表单范围变量(最好的方法是添加自定义 属性)来存储和操作表单的事件状态。
查看此示例并根据此重新编写代码,此示例适用于 CheckBox,但相同的逻辑适用于 ListBox、ComboBox 等...
'/ 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
我在 VBA Excel 的用户表单中有两个多 select 列表框。
一个包含国家,另一个包含城市。
如果用户单击 selects/deselects 一个国家,我希望我的脚本自动 select/deselect 第二个列表框中位于该国家/地区的所有城市。
同样,我希望如果用户单击并 selects/deselects 一个城市,它会自动更新第一个列表框以仅突出显示其所有相应城市目前都已 select 的国家。
我的问题是:
通过使用 OnChange 事件(OnClick 不适用于多个 select 列表框),每次更改其中一个列表框时,它都会更改另一个。
在此上下文中,这意味着任何时候更改一个国家/地区都会更改第二个列表框中的所有相应城市 - 对于每个国家/地区,用户实际上被限制为 select 所有城市或 none.
是否可以判断列表框是被用户更改还是被脚本更改?如果没有,是否存在可以满足我的目标的替代方法?
感谢您的阅读。
Application.EnableEvents 对 UserForm 对象没有影响。
您需要一个表单范围变量(最好的方法是添加自定义 属性)来存储和操作表单的事件状态。
查看此示例并根据此重新编写代码,此示例适用于 CheckBox,但相同的逻辑适用于 ListBox、ComboBox 等...
'/ 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