Word全局模板VBA:当放置在Startup文件夹中时,ContentControlOnExit事件不会触发

时间:2016-09-13 23:18:02

标签: vba templates events ms-word word-contentcontrol

以下代码放在.dotm模板文件中的ThisDocument字对象中。直接打开文件时,每次退出活动文档中的内容控件时,下面的事件将按预期触发。但是,当模板放在“启动”文件夹中并自动打开时,事件不会触发。

有关如何将其修改为从Startup文件夹中按预期工作的任何想法?

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

1 个答案:

答案 0 :(得分:0)

我过去也曾遇到过这个问题。 你不会让它像这样工作,它只会在你加载的" * .dotm" -file本身上为ContentControlOnExit事件触发事件。

要对宏文档外部发生的更改做出反应,您必须使用一个相当复杂的构造,我将简要向您解释。

您必须创建一个类clsDocument,其中包含变量Public WithEvents p_Document as Word.Document。在课堂内,您可以收听ContentControlOnExit的事件p_Document并将代码放入其中(在您的情况下为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文件,因此全局模板文件。

通过这种方式,您可以对您想要的事件做出反应。 虽然我还没有找到解决这个问题的另一种方法,但我仍然不满意它是如何实现的。如果还有其他选择来解决您的问题,我强烈建议您尝试另外一种方式。