我在過去也遇到過這個問題。 您不會像這樣工作,它只會在您加載的「* .dotm」文件本身上觸發事件ContentControlOnExit
事件。
要對您的宏文檔之外發生的更改作出反應,您必須使用一個相當複雜的構造,我將向您簡單介紹一下。
您必須創建一個類別clsDocument
,其中您有一個變量Public WithEvents p_Document as Word.Document
。內部類的,你再聽聽事件您p_Document
的ContentControlOnExit
,把你的代碼在那裏(你的情況MsgBox ("Fired")
。
接下來,你要聽一般事件「AutoExec的」和「的AutoOpen」以及作爲「Application_DocumentChange」在所有這些事件中,您基本上只是將全局變量p_Document
設置爲傳遞給事件的文檔的值或(如果沒有傳遞給事件處理程序的文檔)活動文檔的值 由於所有那些事件反應或多或少地做同樣的事情,在你的宏的模塊中創建一個新程序,如下所示:
Public g_clsWordDocument As clsDocument
Public Sub SetUpDocumentEvents(Optional ByRef a_Document As Word.Document = Nothing)
If Application.Documents.Count > 0 Then
If a_Document Is Nothing Then Set a_Document = ActiveDocument
Set g_clsDocument = New clsDocument
Set g_clsDocument.p_Document = a_Document
End If
End Sub
然後,在您的宏文件的ThisDocument
中創建以下過程。
Option Explicit
Private g_clsWordApplication As clsApplication
Public Sub AutoExec()
Set g_clsWordApplication = New clsApplication
Set g_clsWordApplication.WordApplication = Word.Application
Call modYourModule.SetUpDocumentEvents
End Sub
Private Sub Document_New()
Call modYourModule.SetUpDocumentEvents
End Sub
Private Sub Document_Open()
Call modYourModule.SetUpDocumentEvents
End Sub
Public Sub AutoOpen()
Call modYourModule.SetUpDocumentEvents
End Sub
就像那樣,您可以捕獲文檔事件。正如您在AutoExec
函數中看到的那樣,應用程序對象的情況也是如此,只需創建一個新的clsAplication
即可,其中WithEvents WordApplication as Word.Application
可以響應事件。所有這些代碼進入你的dotm文件,所以全局模板文件。
通過這種方式,您可以對您想要的事件做出反應。 儘管我還沒有找到解決這個問題的另一種方法,但我仍然不滿意它如何實施。如果還有其他選擇來解決您的問題,我強烈建議您嘗試另一種方式。
我沒有解決方案,但解釋了爲什麼不會發生這種情況 - 觸發活動文檔的事件,啓動時的模板基本上在後臺運行,因此當您在處理另一個文檔時該事件在本文檔中觸發,而不是在您的模板中觸發。 – Carrosive