Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 多个工作表更改事件相互触发_Excel_Vba_Combobox - Fatal编程技术网

Excel 多个工作表更改事件相互触发

Excel 多个工作表更改事件相互触发,excel,vba,combobox,Excel,Vba,Combobox,我有一个工作簿,工作表中有多个工作表更改事件。 每个宏都与一个活动的x组合框相关 问题是,当我更改其中一个组合框时,宏会激发(如预期的那样),这反过来又会启动另一个宏(不应该运行)。我已经设置了Application.EnableEvents=False 但问题可能是我正在更改cell.value,它链接到另一个组合框,因此也链接到另一个工作表更改事件 在我看来,一种解决方法可能是,如果组合框是实际选中的组合框,那么只运行宏,但第二个问题来了。我找不到让vba返回活动组合框名称的方法 请注意,这

我有一个工作簿,工作表中有多个工作表更改事件。 每个宏都与一个活动的x组合框相关

问题是,当我更改其中一个组合框时,宏会激发(如预期的那样),这反过来又会启动另一个宏(不应该运行)。我已经设置了Application.EnableEvents=False 但问题可能是我正在更改cell.value,它链接到另一个组合框,因此也链接到另一个工作表更改事件

在我看来,一种解决方法可能是,如果组合框是实际选中的组合框,那么只运行宏,但第二个问题来了。我找不到让vba返回活动组合框名称的方法

请注意,这些组合框没有连接到userform,它们只是直接放置在工作表上

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


非常感谢您提供的任何帮助,

重新启用事件时可能出现错误……。您可以随时插入:

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