Application.EnableEvents =假不工作

我似乎没有理解Excel 2007的奇怪行为,并且在一打解决scheme之后,我来找你寻求帮助。

我有办公室2007年。

这是我的class级模块代码:

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. Excel出现故障或者我错了吗?
  2. 我怎样才能执行表单事件? 很显然,Application.EnableEvents = false并不能阻止事件被上游触发。

提前感谢您的帮助!

亲切的问候,拉杜

我认为这个问题可能是你在表单模块中使用SelectionChange事件。 你对事件的顺序是正确的。 这是怎么回事 – 你是事件有*

 Worksheet_Change Workbook_SheetChange* Application_SheetChange* 

然后假设在你input内容后select移动

 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事件代码将在主表的类模块中,所以它只会响应该页面上的事件。