2014-03-27 38 views
0

我有一个工作簿,其中有多个Worksheet_Change事件。 这些宏中的每一个都与活动的x组合框有关。多个Worksheet_change事件互相发射

问题是,当我更改其中一个组合框时,宏触发(按预期),然后又启动另一个宏(它不会运行)。我已经设置了Application.EnableEvents = False 但问题可能是我正在更改一个cell.value,它链接到另一个组合框,因此也链接到另一个worksheet_change事件。

解决方案,因为我看到它,可能只运行宏,如果组合框是实际选定的,但这里出现第二个问题。我无法找到一种方法让vba返回活动组合框的名称。

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

有没有人对如何解决这个问题有任何想法?

任何帮助是非常赞赏,

回答

0

有可能是一个错误的地方,重新启用活动...........您可以随时插入:

MsgBox Application.EnableEvents 

在指出你的代码来捕获它。

1

我看到有2个可能的解决方案...

1 - 由加里的学生说,你可能已经在不知不觉中某处切换的Application.EnableEvents,你可以尝试和陷阱哪里发生这种情况。

2 - 也许设置一个叫做DontRunMacros的全局布尔变量,并在第一个宏开始时将其设置为TRUE,最后将其设置为FALSE。那么你只需要让对方的宏以If DontRunMacros Then Exit Sub开头 - 这样可以防止其他人不管发生什么事情都在运行...

希望对你有所帮助!

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 
0

非常感谢您的快速回复。

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

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

但是因为我需要工作表中的代码运行时计算的一些细胞,我不能设置application.Calculation = xlManual。 因此,代码仍然尝试执行一堆其他更改事件,但上面的代码阻止它们运行的​​不仅仅是第一行。然而,这仍然需要很多时间,这是非常令人沮丧的。猜猜我只需要再次考虑这个问题。

这是我如何开始和结束我的所有worksheet_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