Application.EnableEvents = False无法正常工作

时间:2011-03-02 15:10:57

标签: excel vba programming-languages

我似乎不理解Excel 2007的奇怪行为,经过十几个解决方案后,我来找你寻求帮助。

我有办公室2007年。

这是我的类模块代码:

Public WithEvents App As Application
Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox "event din app"
End Sub

这是我的InitializeAppObject模块:

Dim X As New EventClassModule
Sub InitializeApp()
    Set X.App = Application

    MsgBox "am facut setarea"

End Sub

这是我的一张代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Not Application.Intersect(Target, Me.Range("a1:c10")) Is Nothing _
    Then
        Application.EnableEvents = False
        MsgBox "suntem in range"
        Application.EnableEvents = True
    Else
        MsgBox "nu suntem in range"
    End If
End Sub

在更改网格上的任何值之前,我执行InitializeApp()过程。

根据我的理解,首先应该触发工作表事件,然后是工作簿一个,然后是应用程序一个。然而,这种情况并非如此。它首先启动工作簿1,应用程序1,最后是工作表。

  1. Excel出现故障还是我弄错了?
  2. 如何才能执行工作表事件?显然,Application.EnableEvents = false并没有阻止事件被上游触发。
  3. 非常感谢您提供所有帮助!

    亲切的问候, 拉杜

1 个答案:

答案 0 :(得分:2)

我认为问题可能是您在工作表模块中使用了SelectionChange事件。你对事件的顺序是正确的。这是怎么回事 - 你的活动有*

Worksheet_Change
Workbook_SheetChange*
Application_SheetChange*

然后假设在您输入内容后选择移动

Worksheet_SelectionChange*
Workbook_SheetSelectionChange
Application_SheetSelectionChange

您的代码中没有任何内容触发事件,因此在EnableEvents之间放置消息框无法获得所需的结果。在第一个事件代码运行时,所有事件都已排队。相反,你有

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.EnableEvents = False
        Sh.Range("a1").Value = 1
    Application.EnableEvents = True
End Sub

然后,更改A1值的代码不会触发任何事件。如果您只想运行Worksheet_Change事件,则应删除其他事件代码。好吧,这可能是有充分理由的。但是,当您运行哪个事件代码需要在过程中时,无论逻辑是什么。例如,如果您只想在特定工作表名称“Master”上运行Worksheet_Change事件,则可以像这样设置

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name <> "Master" Then
        MsgBox "event din app"
    End If
End Sub

Worksheet_Change事件代码将在主表的类模块中,因此它只响应该页面上的事件。