我在工作表中有一个包含多个Worksheet_Change事件的工作簿。 这些宏中的每一个都与活动的x组合框相关。
问题在于,当我更改其中一个组合框时,宏会触发(如预期的那样),从而启动另一个宏(不应该运行)。我已经设置了Application.EnableEvents = False 但问题可能是我正在更改一个cell.value,它与另一个组合框相关联,因此也链接到另一个worksheet_change事件。
我认为,解决方法可能只是运行宏,如果组合框是实际选择的那个,但这是第二个问题。我无法找到让vba返回活动组合框名称的方法。
请注意,这些组合框未连接到用户表单,只是直接放在工作表上。
有没有人知道如何解决这个问题?
非常感谢任何帮助,
答案 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