2016-09-13 103 views
-1

下面的代碼放置在.Dotm模板文件中的ThisDocument字對象中。當文件直接打開時,每次退出活動文檔中的內容控件時,下面的事件會按預期觸發。但是,當模板放置在啓動文件夾中並自動打開時,該事件不會觸發。Word全局模板VBA:ContentControlOnExit事件放置在Startup文件夾中時未觸發

有關如何修改以便按照預期從Startup文件夾工作的任何想法?

Private Sub Document_ContentControlOnExit(ByVal ContentControl As _ 
ContentControl, Cancel As Boolean) 
    MsgBox ("Fired") 
End Sub 
+0

我沒有解決方案,但解釋了爲什麼不會發生這種情況 - 觸發活動文檔的事件,啓動時的模板基本上在後臺運行,因此當您在處理另一個文檔時該事件在本文檔中觸發,而不是在您的模板中觸發。 – Carrosive

回答

0

我在過去也遇到過這個問題。 您不會像這樣工作,它只會在您加載的「* .dotm」文件本身上觸發事件ContentControlOnExit事件。

要對您的宏文檔之外發生的更改作出反應,您必須使用一個相當複雜的構造,我將向您簡單介紹一下。

您必須創建一個類別clsDocument,其中您有一個變量Public WithEvents p_Document as Word.Document。內部類的,你再聽聽事件您p_DocumentContentControlOnExit,把你的代碼在那裏(你的情況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文件,所以全局模板文件。

通過這種方式,您可以對您想要的事件做出反應。 儘管我還沒有找到解決這個問題的另一種方法,但我仍然不滿意它如何實施。如果還有其他選擇來解決您的問題,我強烈建議您嘗試另一種方式。

+0

我相信我理解你解釋的基本概念。我將發佈上面附加到我的問題中的代碼,但我對類模塊的使用經驗有限。你能詳細說說聽AutoExec和其他一般事件嗎?這會放在全局模板文件或活動文檔中嗎? – DGulledge

+0

@DGulledge看看我的答案,我編輯它給你更多的信息。 – codeguy

相關問題