在VBA(在Excel中)中,区分以编程方式更改的列表框与单击时的区别

时间:2016-07-21 18:56:12

标签: vba excel-vba listbox onchange multi-select

我在Excel中的VBA中的用户窗体中有两个多选列表框。

一个包含国家/地区,另一个包含城市。

如果用户点击并选择/取消选择某个国家/地区,我希望我的脚本能够在第二个列表框中自动选择/取消选择该国家/地区中的所有城市。

同样,我希望如果用户点击并选择/取消选择某个城市,它会自动更新第一个列表框,以仅突出显示当前所有相应城市都已选中的国家/地区。

我的问题是:

通过使用OnChange事件(OnClick不适用于多选列表框),每次更改列表框时,它都会更改另一个。

在这种情况下,这意味着每当国家/地区发生变化时,它都会更改第二个列表框中的所有相应城市 - 对于每个国家/地区,用户实际上仅限于选择所有城市或没有城市。

是否要告知用户或脚本是否更改了列表框?如果没有,是否存在可以满足我目标的替代方法?

感谢您的阅读。

1 个答案:

答案 0 :(得分:0)

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