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元素不可用,或者至少在我需要在代码中到处设置布尔变量的情况下,至少不能使用它。
在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)
| 归档时间: |
|
| 查看次数: |
3687 次 |
| 最近记录: |