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

TL; DR:如何防止在添加或删除源列表中的项目时触发ActiveXcombobox

请注意,我已经看到这个post ,这是不是同样的问题,或者说,它不提供一个可行的解决scheme,我目前的项目。

您可以通过创build一个ActiveXcombobox,并从A1:A4,输出单元格B2,然后添加此代码在工作表上给它一个源列表范围复制问题:

Private Sub ComboBox1_Change() MsgBox ("hello") End Sub Sub TestAddItem() Range("A4").Insert xlDown Range("A4").Value = "NewItem" End Sub 

如果您运行TestAddItem ,在进入“New Item”行时,将触发combobox的Change事件。

我已经search了解决scheme,但只能find解决方法build议添加一个布尔variables,检查是否实际进行更改事件中的代码。 以下是我的例子中的样子:

 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 

如果combobox的目的地被改变,同样的事情发生。 手动添加或删除源范围内的项目不会触发事件。

注意: Application.EnableEvents = False对ActiveX元素没有影响! 无论如何,他们会开火(由微软devise)

我如何防止这种情况发生? 现在,这个ActiveX元素是不可用的,或者至less我不能使用它,如果我需要在代码中的任何地方设置布尔variables。

在OP的评论后编辑

因为涉及事件计时 ,所以在工作表代码窗格中就足够了:

 Option Explicit Dim bMakeItHappen As Boolean Private Sub ComboBox1_DropButtonClick() bMakeItHappen = True End Sub Private Sub ComboBox1_Change() If bMakeItHappen Then MsgBox ("hello") '<-- ie the code to be executed at "actual" combobox value change bMakeItHappen = False End If End Sub