如何防止在更改源列表时调用ComboBox Change事件

时间:2016-10-12 07:57:29

标签: excel vba excel-vba

TL; DR:如何在源列表中添加或删除项目时阻止触发ActiveX ComboBox

请注意我已经看过this post并且它不是同一个问题,或者它没有为我当前的项目提供可行的解决方案。

您可以通过创建ActiveX ComboBox并在A1:A4,输出单元格B2的工作表上为其提供源列表范围,然后添加此代码来复制问题:

Private Sub ComboBox1_Change()
    MsgBox ("hello")
End Sub

Sub TestAddItem()
    Range("A4").Insert xlDown
    Range("A4").Value = "NewItem"
End Sub

如果您在进入" New Item"之后运行TestAddItem在行中,将触发组合框的Change事件。

我已经搜索了这个解决方案,但只能找到解决方法建议添加一个布尔变量来检查是否实际继续更改事件中的代码。这是我的例子中的样子:

Option Explicit
Public bMakeItHappen As Boolean

Private Sub ComboBox1_Change()
    If bMakeItHappen Then
        MsgBox ("hello")
    End If
End Sub

Sub TestAddItem()
    bMakeItHappen = False
    Range("A4").Insert xlDown
    Range("A4").Value = "NewItem"
End Sub

如果更改了组合框的目标,则会发生同样的情况。手动添加或删除源范围中的项目不会触发事件。

注意:Application.EnableEvents = False对ActiveX元素没有影响!他们无论如何都会开火(来自微软的设计)

如何防止这种情况发生?目前,这个ActiveX元素无法使用,或者至少我无法使用它,如果我需要在代码中的任何地方设置布尔变量

1 个答案:

答案 0 :(得分:4)

在OP的评论后编辑

由于涉及事件计时,它就足以满足工作表代码窗格中的以下代码:

loaded === total