【问题标题】:Word Global Template VBA: ContentControlOnExit event not firing when placed in the Startup folderWord 全局模板 VBA:ContentControlOnExit 事件放置在启动文件夹中时未触发
【发布时间】:2017-01-21 15:55:16
【问题描述】:

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

关于如何修改它以从启动文件夹中按预期工作的任何想法?

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

【问题讨论】:

  • 我没有解决方案,但要解释为什么没有发生这种情况 - 为活动文档触发事件,启动中的模板基本上在后台运行,所以当你工作时在另一个文档上执行该事件在此文档中而不是在您的模板中触发的操作。

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


【解决方案1】:

我过去也遇到过这个问题。 你不会让它像那样工作,它只会在你加载的“*.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 函数中看到的那样,应用程序对象也是如此,只需创建一个带有WithEvents WordApplication as Word.Application 的新clsAplication,您就可以对事件做出反应。所有这些代码都进入您的 dotm 文件,因此是全局模板文件。

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

【讨论】:

  • 我相信我理解你所解释的基本概念。我将发布到目前为止的代码,附加到我上面的问题中,但是我对类模块的经验是有限的。你能详细说明听 AutoExec 和其他一般事件吗?这会放在全局模板文件还是活动文档中?
  • @DGulledge 看看我的答案,我对其进行了编辑以提供更多信息。
猜你喜欢
  • 2019-10-12
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多