如何在关闭Word文档之前要求确认?

时间:2019-06-24 11:56:33

标签: vba ms-word

我使用2种不同的键盘布局(qwerty和azerty),并且不断使用Alt-Shift在这两种键盘之间切换。有时,当我到达Ctrl-Z来撤消时,我得到了Ctrl-W来关闭文档。一般来说,在这种情况下,我会得到“保存提示”,这将使我警惕自己的错误。但是,我现在使用的是OneDrive,对正在处理的文档进行自动保存。结果,永远不会出现此保存提示。该文档会立即关闭,更糟糕的是,重新打开该文档时,我尝试执行的撤消操作不再存在。

我想使用附加到普通模板的VBA,这样,在关闭使用VBA模板创建的任何文档时,我将检查是否打开了自动保存功能,如果已打开,请在关闭消息框之前进行确认。 显然,如果用户不确认(例如选择“取消”),则不应关闭该文档。

最初,我将代码放在Document_Close上,但很快意识到在这里取消取消为时已晚。这对我不好。 然后,基于一些在线代码,我将代码放在一个类模块(EventClassModule)中。在ThisDocument模块中,我初始化类并激活事件处理程序。 我的代码似乎从未运行过,或者在任何情况下都没有断点。

我不确定Normal的停止位置和我的普通文档的开始位置...

在普通模板的ThisDocument中,我有这个VBA

Dim X As New EventClassModule

Sub Register_Event_Handler()
    Set X.App = Word.Application
End Sub

Private Sub Document_Open()
    Register_Event_Handler
End Sub

我有一个名为EventClassModule的类模块,其中包含以下内容

Public WithEvents App As Word.Application

Private Sub App_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)

Dim res As VbMsgBoxResult

    If Me.AutoSaveOn Then
        res = MsgBox("OK to Confirm", vbOKCancel, "Closing Document")
        If res = vbCancel Then
            Cancel = True
        End If
    End If

End Sub

无论何时关闭文档并关闭自动保存选项,我都会提示您确认保存。

2 个答案:

答案 0 :(得分:1)

仅通过文件|打开普通模板时,才会触发Document_Open事件处理程序。打开。若要使代码在启动Word时响应,您需要使用AutoExec例程。只需如下重命名您的例程。您可以找到有关自动宏here

的更多信息
Public Sub AutoExec()
  Register_Event_Handler
End Sub

答案 1 :(得分:0)

这是一种简单的方法,包括这样的方法:

Public Sub DocClose()
    ' Disables Ctrl + W  (but not other close methods, e.g. Alt + F4, menus, [X])
    ' Your code here:
    ActiveDocument.Close 
End Sub

基本上,MS-Word在内部使用一些方法名称,如果将它们包含在代码中,它们将阻止默认操作。如果将子级留空,则会有效地禁用 Ctrl + W

有关更多信息,请参见此处:Reserved method names in MS Word VBA


这项技术的优势1

如果您使用Public WithEvents App As Word.Application且您的项目由于任何原因被重置,但无法重新启动... App将为Nothing,并且所有事件均不会触发。

该技术的优势2

在您实际上想要关闭文档的情况下……使用这种技术,您不会被(很快成为)烦人的确认消息所困扰-只需说一句;-)