Excel 多个工作表更改事件相互触发
我有一个工作簿,工作表中有多个工作表更改事件。 每个宏都与一个活动的x组合框相关 问题是,当我更改其中一个组合框时,宏会激发(如预期的那样),这反过来又会启动另一个宏(不应该运行)。我已经设置了Application.EnableEvents=False 但问题可能是我正在更改cell.value,它链接到另一个组合框,因此也链接到另一个工作表更改事件 在我看来,一种解决方法可能是,如果组合框是实际选中的组合框,那么只运行宏,但第二个问题来了。我找不到让vba返回活动组合框名称的方法 请注意,这些组合框没有连接到userform,它们只是直接放置在工作表上 有没有人知道如何解决这个问题Excel 多个工作表更改事件相互触发,excel,vba,combobox,Excel,Vba,Combobox,我有一个工作簿,工作表中有多个工作表更改事件。 每个宏都与一个活动的x组合框相关 问题是,当我更改其中一个组合框时,宏会激发(如预期的那样),这反过来又会启动另一个宏(不应该运行)。我已经设置了Application.EnableEvents=False 但问题可能是我正在更改cell.value,它链接到另一个组合框,因此也链接到另一个工作表更改事件 在我看来,一种解决方法可能是,如果组合框是实际选中的组合框,那么只运行宏,但第二个问题来了。我找不到让vba返回活动组合框名称的方法 请注意,这
非常感谢您提供的任何帮助,重新启用事件时可能出现错误……。您可以随时插入:
MsgBox Application.EnableEvents
在您的代码中,我发现有两种可能的解决方案 1-正如Gary的学生所说,您可能在不知情的情况下切换了
应用程序。EnableEvents
,您可以尝试在发生这种情况的地方设置陷阱
2-可以设置一个名为DontRunMacros
的全局布尔变量,并在第一个宏的开头将其设置为TRUE
,在结尾将其设置为FALSE
。然后,您只需让其他宏以开始,如果是DontRunMacros,则退出Sub
——这将阻止其他宏运行,而不管触发的事件是什么
希望有帮助 您还可以设置一个全局变量来处理事件。您可以在每个更改事件开始时进行检查
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
非常感谢您的快速回复 我最终在工作表中使用了一个命名的单元格,类似于hstay所建议的
If ThisWorkbook.Sheets("MD").Range("AllowMacro").Value = 0 Or Me.Name <> ActiveSheet.Name Then Exit Sub
如果ThisWorkbook.Sheets(“MD”).Range(“AllowMacro”).Value=0或Me.Name ActiveSheet.Name,则退出Sub
但是,由于代码运行时需要工作表来计算某些单元格,因此无法设置application.Calculation=xlManual。
因此,代码仍然尝试执行一系列其他更改事件,但上面的代码阻止它们运行的不仅仅是第一行。然而,这仍然需要很多时间,这是相当令人沮丧的。我想我下次再考虑一下
以下是我开始和结束所有工作表技术事件的方式:
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
如果ThisWorkbook.Sheets(“MD”).Range(“AllowMacro”).Value=0或Me.Name
ActiveSheet.Name,然后退出Sub
ThisWorkbook.Sheets(“MD”).Range(“AllowMacro”).Value=0
Application.ScreenUpdating=False
Application.EnableEvents=False
'触发其他更改事件的一些随机代码
Application.EnableEvents=True
Application.ScreenUpdating=True
ThisWorkbook.Sheets(“MD”).Range(“AllowMacro”).Value=1