多个Worksheet_change事件互相激发

时间:2014-03-27 15:32:41

标签: excel vba combobox

我在工作表中有一个包含多个Worksheet_Change事件的工作簿。 这些宏中的每一个都与活动的x组合框相关。

问题在于,当我更改其中一个组合框时,宏会触发(如预期的那样),从而启动另一个宏(不应该运行)。我已经设置了Application.EnableEvents = False 但问题可能是我正在更改一个cell.value,它与另一个组合框相关联,因此也链接到另一个worksheet_change事件。

我认为,解决方法可能只是运行宏,如果组合框是实际选择的那个,但这是第二个问题。我无法找到让vba返回活动组合框名称的方法。

请注意,这些组合框未连接到用户表单,只是直接放在工作表上。

有没有人知道如何解决这个问题?

非常感谢任何帮助,

4 个答案:

答案 0 :(得分:1)

我看到有两种可能的解决方案......

1 - 正如Gary的学生所说,你可能在某个地方不知不觉地切换了Application.EnableEvents,你可以试着去陷阱。

2 - 也许设置一个名为DontRunMacros的全局布尔变量,并在第一个宏的开头设置为TRUE,最后设置为FALSE。然后你只需让对方的宏开始If DontRunMacros Then Exit Sub - 这将阻止其他人运行而不管发生的事件......

希望有所帮助!

答案 1 :(得分:1)

您还可以设置全局变量处理事件。您可以在每次更改事件开始时进行检查。

Dim ufEventsDisabled As Boolean

Sub YourSub()
    ufEventsDisabled = False
    Range("A1").Value=1 'This triggers the event

    ufEventsDisabled = True
    Range("A1").Value=1 'This doesn't trigger the event

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If ufEventsDisabled=True Then Goto ExitEvent:
    'Your regular worksheet code

ExitEvent:
    ufEventsDisabled=False
End Sub

答案 2 :(得分:0)

某处可能存在重新启用事件的错误...........您可以随时插入:

MsgBox Application.EnableEvents

在你的代码中用来捕获它的点。

答案 3 :(得分:0)

非常感谢您的快速回复。

我最终在工作表中使用了一个命名单元格,类似于hstay sugested。

If ThisWorkbook.Sheets("MD").Range("AllowMacro").Value = 0 Or Me.Name <> ActiveSheet.Name Then Exit Sub

然而,由于我需要工作表来计算代码运行时的一些单元格,我无法设置application.Calculation = xlManual。 所以代码仍然试图执行一堆其他更改事件,但上面的代码阻止它们运行的​​不仅仅是第一行。然而,这仍然需要很多时间,这非常令人沮丧。猜猜我只需要考虑到另一个时间。

这就是我开始和结束所有workheet_chnage事件的方式:

If ThisWorkbook.Sheets("MD").Range("AllowMacro").Value = 0 Or Me.Name <> 
ActiveSheet.Name Then Exit Sub
ThisWorkbook.Sheets("MD").Range("AllowMacro").Value = 0
Application.ScreenUpdating = False
Application.EnableEvents = False

'some random code that trigger other change_events

Application.EnableEvents = True
Application.ScreenUpdating = True
ThisWorkbook.Sheets("MD").Range("AllowMacro").Value = 1