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

roh*_*l77 2 excel vba excel-vba

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

请注意,我看过这篇文章,它不是一个相同的问题,或者它不能为我当前的项目提供可行的解决方案。

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

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

Sub TestAddItem()
    Range("A4").Insert xlDown
    Range("A4").Value = "NewItem"
End Sub
Run Code Online (Sandbox Code Playgroud)

如果运行TestAddItem,则在转到“新建项目”行时,Change将触发组合框的事件。

我已经找到了解决方案,但是只能找到解决方法,建议添加一个布尔变量,该布尔变量检查是否在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
Run Code Online (Sandbox Code Playgroud)

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

注意:Application.EnableEvents = False对ActiveX元素没有影响!他们仍然会开火(由Microsoft设计)

如何防止这种情况发生?就目前而言,此ActiveX元素不可用,或者至少在我需要在代码中到处设置布尔变量的情况下,至少不能使用它。

use*_*756 5

在OP评论后编辑

由于涉及事件计时,因此它在工作表代码窗格中满足以下代码要求:

Option Explicit

Dim bMakeItHappen As Boolean

Private Sub ComboBox1_DropButtonClick()
    bMakeItHappen = True
End Sub


Private Sub ComboBox1_Change()   
    If bMakeItHappen Then
        MsgBox ("hello") '<-- i.e. the code to be executed at "actual" combobox value change
        bMakeItHappen = False
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)