禁用“另存为”但不能在Word 2010中保存

时间:2017-11-21 23:02:10

标签: ms-word save word-vba

我希望在Word 2010文件中禁用“另存为”但仍允许保存。换句话说,我希望用户能够更新现有文件,但不能创建副本。我意识到这对于那些了解变通方法的人来说是不可能真正做到的,但对于普通用户我已经在Excel中成功完成了这一点,但对于VBA来说这是一个新手。

当我将以下内容添加到一个全新的文档中时,一切都按预期工作:

Sub FileSaveAs()
MsgBox "Copies of this file cannot be created. Please save changes in the original document." & _
, , "Copy Cannot be Created"
End Sub

我的文档有各种命令按钮的宏,但没有一个涉及保存文档(原始名称或另存为)。还有一个宏在打开时运行,但是一行转到书签。当我尝试"另存为"在本文档中,我按预期获得了消息框。当我试图"保存"虽然事情变得奇怪:我把保存视为对话(问题1)。无论我是尝试以相同名称还是其他名称保存,对话的行为都与通常情况一样,除非它不会保存并且对话框会自动再次打开,从而基本上创建无限循环,直到我点击取消(问题2)。我也间歇性地得到了一个'#34;磁盘满了'#34;尝试保存之后警告弹出,我可以解雇,但只要文件打开几分钟后出现(可能与自动保存相关?)

由于宏在测试文件中工作,我认为这个奇怪的行为必须是我的代码中的其他地方,但我的文档与其他宏保存正常,只要我不包含上面的代码保存,所以现在我和#39;我完全糊涂了。在我提出其余冗长的代码之前,由于上述原因,我不会想到有影响的事情,我想我会问这个:
1.除了我的其他命令按钮宏之外是否还有其他地方可能导致此行为?
2.有没有更好的方法人们建议实现我的最终目标,即禁用保存但不保存?

提前感谢您提供的任何建议。

1 个答案:

答案 0 :(得分:0)

Word应用程序有DocumentBeforeSave个事件。要启用应用程序事件,我建议使用名称ThisApplication创建一个类模块,并将以下代码粘贴到其中。

Option Explicit

    Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Word.Application
End Sub

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, _
                                   SaveAsUI As Boolean, _
                                   Cancel As Boolean)
    If SaveAsUI Then
        MsgBox "Please always use the ""Save"" command" & vbCr & _
               "to save this file.", _
               vbExclamation, "SaveAs is not allowed"
        Cancel = True
    End If
End Sub

将以下代码添加到ThisDocument模块。

    Dim WdApp As ThisApplication

Private Sub Document_Open()
    Set WdApp = New ThisApplication
End Sub

您可以将Set App = ...行添加到现有的Document_Open程序中。在初始化WdApp变量之后,ThisApplication类将接收所有应用程序事件,其中DocumentBeforeSave事件过程被编程为不允许SaveAs

当然,这是对所有文件的全面拒绝。因此,您可能希望向过程添加代码,以仅限制对某些文档的限制。 proc接收整个文档对象及其所有属性,包括Name,Path,FullName和内置属性以及自定义属性。您可以识别您希望受其中任何影响的文件。

请注意,如果程序崩溃,WdApp变量将被删除。如果发生这种情况,应用程序事件将不再触发。知道应用程序事件在文档事件之前发生可能是有用的。如果您希望使用应用程序的DocumentOpen事件以及代替文档的Document_Open事件,则可能会这样做。