Word文档关闭时是否触发VBA事件?

Word文档关闭时是否触发VBA事件?,vba,events,ms-word,Vba,Events,Ms Word,我试图使用Normal.dotm作为宏存储对象,类似于Excel中的Personal.xlsb对象 内置文件似乎无法触发,除非它包含在特定文档的ThisDocument对象中 我也尝试过这样使用此事件,但没有效果: Private Sub Application_Quit() Msgbox "closing word" End Sub 是否可以像在excel中一样使用Auto\u Close()等来侦听word应用程序的关闭 基于的@BigBen的尝试 类别模块“事件类别模块” 正常

我试图使用
Normal.dotm
作为宏存储对象,类似于Excel中的
Personal.xlsb
对象

内置文件似乎无法触发,除非它包含在特定文档的
ThisDocument
对象中

我也尝试过这样使用此事件,但没有效果:

Private Sub Application_Quit()
    Msgbox "closing word"
End Sub
是否可以像在excel中一样使用
Auto\u Close()
等来侦听word应用程序的关闭


基于的@BigBen的尝试

类别模块“事件类别模块”

正常模块“模块1”


当任何Word文档关闭时,有两种基本的捕获方法:

  • 在Normal.dotm的任何模块(或作为加载项加载的任何模板)中使用名为
    AutoClose
    的宏。这是来自WordBasic(Word2.0和6.0)时代的“老式”方式
  • 请注意,如果任何其他文档(或模板)具有
    AutoClose
    ,则这将超越运行“更一般”级别的宏。换句话说,特定于文档(或模板)的代码具有优先权

    Sub AutoClose()
      MsgBox "The document " & ActiveDocument.FullName & " is closing."
    End Sub
    
  • 处理应用程序级事件。这需要一个类模块和一个“普通”模块。事件代码在类模块中;初始化类的代码必须位于“普通”模块中
  • 此事件的名称为
    DocumentBeforeClose
    ,可由用户和代码取消(请参阅事件签名中的
    Cancel
    参数)

    自动关闭相比
    ,如果有多个文档或模板运行该事件,则会触发所有事件-没有优先级或“覆盖”

    名为clsEvents的类模块

    Public WithEvents app As Word.Application
    
    Private Sub app_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
      MsgBox "The document " & Doc.FullName & " is being closed."
    End Sub
    
    模块

    Public WithEvents App As Word.Application
    
    Public myEvents As New clsEvents
    
    Public Sub StartEvents()
        Set myEvents.app = Word.Application
    End Sub
    
    Public Sub EndEvents()
        Set myEvents.app = Nothing
    End Sub
    
    请注意,如果两种类型的事件都存在,
    AutoClose
    DocumentBeforeClose
    之后触发

    还请注意,有一个特定于文档的事件将仅针对该文档触发:
    document\u Close
    。此事件必须位于该文档的
    ThisDocument
    类模块中

    Private Sub Document_Close()
    
    End Sub
    

    您究竟是如何尝试实现
    应用程序_Quit
    事件的?@BigBen添加了我对上述事件的尝试该事件的文档说明“此代码必须放在类模块中,并且必须正确初始化类实例才能看到此示例工作;有关如何完成此操作的说明,请参阅。”我会从那里开始。@BigBen我想我做了一次很好的尝试,但没有成功(尝试增加了问题)@BigBen的方法在
    Sub-App_-Quit()时有效
    放在类模块中,而
    AutoExec
    用在
    Normal.dotm
    中的标准模块中,用于在word应用程序开始时初始化word app,如
    Dim X As New Class1 Sub AutoExec()Set X.app=word.application End Sub
    。2007年测试正常。非常感谢你,这是一个非常令人沮丧的挂断,你在这里写的非常好helpful@Marcucciboy2事实上,我无法在快速搜索网站时找到这些信息,因此我发现写一篇完整的描述很重要。很高兴你问:-)
    Private Sub Document_Close()
    
    End Sub