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

Posted

技术标签:

【中文标题】在 Word 2010 中禁用另存为但不保存【英文标题】:Disable Save As but not Save in Word 2010 【发布时间】:2017-11-21 23:02:09 【问题描述】:

我希望在 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 行到书签。当我尝试在本文档中“另存为”时,我得到了预期的消息框。当我尝试“保存”时,事情变得很奇怪:我将保存为对话(问题 1)。无论我尝试以相同的名称还是其他名称保存,对话的行为都与正常情况一样,只是它不保存并且对话框再次自动打开,基本上创建了一个无限循环,直到我点击取消(问题 2)。尝试保存后,我还会间歇性地弹出“磁盘已满”警告,我可以将其关闭,但只要文件打开,几分钟后就会出现(可能与自动保存有关?)

由于宏在测试文件中有效,我认为这种奇怪的行为一定是我的代码中的其他地方,但是只要我不包含上面的另存为代码,我的文档和其他宏就会正常保存,所以现在我完全糊涂了。在我提出我的其余代码之前很长并且由于上述原因我认为不会影响事情,我想我会问这个: 1. 除了我的其他命令按钮宏之外,还有其他地方可能导致这种行为吗? 2. 有没有人推荐的更好的方法来实现我禁用另存为但不保存的最终目标?

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

【问题讨论】:

【参考方案1】:

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 接收整个文档对象及其所有属性,包括名称、路径、全名和内置以及自定义属性。您可以确定您希望受其中任何影响的文件。

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

【讨论】:

Variatus,非常感谢您的帮助。您的代码不适用于现有文件,但是当我“重新创建”文档(将文档中的所有内容和代码复制并粘贴到新文档中)时,情况会好得多(不知道为什么会发生这种情况,它让我有点不安的是,原始文件中的任何更改都可能在新文件中的某个时间点再次更改,但这是另一回事。 我很确定它是导致问题的 WdApp 变量的初始化。您始终可以使用 F5 运行初始化变量的 Document_Open 过程。您还可以通过在 ThisDocument 表中使用Debug.Print WdApp Is Nothing 编写一个小子来测试 WdApp 是否处于活动状态,然后按 F5 运行它。如果变量被初始化,它将在立即窗口中打印 False。一旦它是,它的事件将为每个文档触发。

以上是关于在 Word 2010 中禁用另存为但不保存的主要内容,如果未能解决你的问题,请参考以下文章

如何在打开的工作簿中禁用 SaveAs 但不禁用 Save

在 MS Word 2010 中另存为的键盘快捷键

怎么把网页上的文档资料下载保存,请指教

SharePoint Online office 365缺少将站点另存为模板选项

保存前不适用于另存为

freemark在linux上生成word以后,怎么转pdf