2011-03-02 99 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