我似乎不理解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,最后是工作表。
非常感谢您提供所有帮助!
亲切的问候, 拉杜答案 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事件代码将在主表的类模块中,因此它只响应该页面上的事件。