【发布时间】:2013-11-29 04:13:07
【问题描述】:
我试图通过在关键点禁用事件来避免事件循环。但是,它并不总是有效。例如,组合框的代码:
Private Sub TempComboS_Change()
Dim e
e = Application.EnableEvents
Application.EnableEvents = False
'
Application.EnableEvents = e
End Sub
空白行是有用代码所在的位置;就目前而言,它显然没有做任何事情。但是,当我以这种方式运行它(使用空白行)时,它会到达“End Sub”,然后它会回到开头并再次运行。 (这会使有用的代码运行两次)。
为什么会这样?
编辑:为那些一直在帮助我的人澄清一下。
我有一个宏,可以打开组合框的下拉列表,激活它,然后结束。它工作正常。当我从打开的列表中选择一个项目时,Change 事件就会运行。这是更改事件的当前版本:
Private Sub TempComboS_Change()
End Sub
我在 Private Sub 行上放了一个断点。它显示此 Change 事件运行,然后再次运行。我怀疑它一直在这样做,现在我注意到了,因为我需要在这里添加代码。
我没有类模块或用户窗体。控件位于工作表上。
我将尝试“运行一次”建议,如果可行,我会通知您。
我尝试了您建议的“运行一次”代码。它排序的作品,但我似乎有一个更大的问题。当我从数据验证单元格中选择下拉列表时,会触发 TempComboS_Change 事件——但我不仅没有触摸此组合框,而且该单元格不是组合框的 LinkedCell。换句话说,它似乎是由 unconnected 到组合框的操作触发的!
必须找出关于调用堆栈的事情......
【问题讨论】:
-
尝试删除
Dim e e = Application.EnableEvents并将Application.EnableEvents = e替换为Application.EnableEvents = True。重新运行代码。它仍然运行两次吗? -
如果它真的命中了
End Sub,那么你的TempComboS_Change()就会从你的代码的另一部分被调用两次。调试并逐步执行您的调用代码。应该能够分辨出第二个电话的来源。您还可以通过删除该子代码中的所有代码并输入msgbox来查看它是否被调用两次来验证这一点。 -
BK201:是的,它仍然运行两次。
-
事实上,如果我中途停止执行,它会立即重新开始。
波特兰:没有调用代码。对于这个测试,我一直在通过更改组合框或在 IDE 窗口中运行程序来运行它。
还有一些奇怪的东西:我插入了一行“TempComboS.Visible = False”来隐藏组合框,但它不起作用。 -
不管为什么触发两次,Application.EnableEvents 都不适用于用户窗体控件。