Vba 如何在允许Word文档关闭之前请求确认?

Vba 如何在允许Word文档关闭之前请求确认?,vba,ms-word,Vba,Ms Word,我使用两种不同的键盘布局qwerty和azerty,并不断使用Alt Shift在这两种键盘布局之间切换。有时候,当我用Ctrl-Z撤销时,我得到的是Ctrl-W,它会关闭文档。一般来说,在这些情况下,我会得到一个保存提示,它会提醒我我的错误。但是,我现在使用的是OneDrive,在我正在处理的文档上使用Autosave。因此,永远不会出现此保存提示。文档会立即关闭,更糟糕的是,当文档重新打开时,我试图执行的撤消操作不再存在 我希望使用附加到普通模板的VBA,这样,在关闭使用VBA模板创建的任何

我使用两种不同的键盘布局qwerty和azerty,并不断使用Alt Shift在这两种键盘布局之间切换。有时候,当我用Ctrl-Z撤销时,我得到的是Ctrl-W,它会关闭文档。一般来说,在这些情况下,我会得到一个保存提示,它会提醒我我的错误。但是,我现在使用的是OneDrive,在我正在处理的文档上使用Autosave。因此,永远不会出现此保存提示。文档会立即关闭,更糟糕的是,当文档重新打开时,我试图执行的撤消操作不再存在

我希望使用附加到普通模板的VBA,这样,在关闭使用VBA模板创建的任何文档时,我将检查Autosave是否已打开,如果已打开,请在关闭之前用messagebox确认。 显然,如果用户未确认,例如选择取消,则不应关闭文档

起初,我将代码放在文档_Close上,但很快就意识到,现在取消关闭已经太晚了。这对我没有好处。 然后,基于一些在线代码,我将代码放在一个类模块EventClassModule中。在ThisDocument模块中,我启动该类,并激活事件处理程序。 我的代码似乎从未运行过,或者在任何情况下,断点都不起作用

我有点不确定正常停止和我的正常文档开始的位置

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

Dim X作为新的EventClassModule 子寄存器事件处理程序 Set X.App=Word.Application 端接头 私有子文档\u打开 寄存器\事件\处理程序 端接头 我有一个名为EventClassModule的类模块

Public with events App As Word.Application 私有子应用程序_文档Before CloseByVal文档作为文档,取消作为布尔值 将分辨率设置为VbMsgBoxResult 如果我是AutoSaveOn那么 res=MsgBoxOK确认、vbok取消、关闭单据 如果res=vbCancel,则 取消=真 如果结束 如果结束 端接头
我希望在任何时候关闭文档并关闭自动保存选项时,都能收到确认保存的提示。

只有通过文件打开普通模板时,文档打开事件处理程序才会启动。要使代码在启动Word时作出响应,需要使用AutoExec例程。只需将您的例程重命名如下。您可以找到有关自动宏的更多信息


下面是一个简单的方法,包括以下方法:

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

有关更多信息,请参见此处:

这项技术的优点1 如果您将Public WithEvents应用程序用作Word.Application,并且您的项目由于任何原因被重置,并且无法重新启动。。。应用程序将为空,并且不会触发任何事件

这项技术的优点2
如果您确实想关闭文档。。。有了这种技术,你就不会被一条很快就会变得烦人的确认信息所打扰——只是说;-

VBA代码看起来好像可以执行您想要的操作。发生了什么?什么都没发生…我看得出来。如果我在if Me.Auto上设置断点…。它从来没有被击中。所以今天早上我的代码似乎被击中了。它给了我一个错误,所以我把我的.AutoSaveOn改为Doc.AutoSaveOn,这似乎起作用了!但那不是昨天,所以我会保持警惕。谢谢你的提示和链接。我最初的解决方案现在似乎正在发挥作用……但如果遇到任何困难,我会尝试一下。我从未听说过这些内部单词方法。这太棒了!如果我的技术失败了,我一定会在三年前给你这个。如果它能像广告宣传的那样工作,那就简单多了。@davidmckinney是的-我几天前才知道这些,是的。。。这基本上是一顿免费午餐。在Word 2016 64位中工作。保持简单也有好处,请参见编辑。干杯,你说得很对。这是解决我问题的完美办法。我已经更换了旧的,这确实会很快变得烦人。不用担心-很高兴它有帮助:-
Public Sub DocClose()
    ' Disables Ctrl + W  (but not other close methods, e.g. Alt + F4, menus, [X])
    ' Your code here:
    ActiveDocument.Close 
End Sub