2011-03-02 94 views
1

我似乎并不了解Excel 2007的奇怪行为,并且在一打解决方案之后,我来找你寻求帮助。Application.EnableEvents =假不工作

我的办公室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()过程。

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

  1. 是Excel故障还是我弄错了?
  2. 如何执行表单事件?很显然,Application.EnableEvents = false并没有从阻止事件被触发上游方面起到任何作用。

非常感谢您的帮助!

亲切的问候, 拉杜

+0

我想这个链接将有所帮助:[链接](http://pastie.org/1624890) – 2011-03-02 15:15:47

回答

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事件,则应该删除其他事件代码。好的,这可能是有原因的。但是,当你运行哪个事件代码需要在程序中时,无论它的逻辑是什么。举例来说,如果你只是想运行在一个特定的工作表名“大师”的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事件代码将在原材类模块,所以它只会响应该页面上的事件。

+0

非常感谢你的时间。但在我看来,你的回答非常模糊。我将翻到一本书,稍后再回来。 – 2011-03-08 13:13:14