我希望在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.有没有更好的方法人们建议实现我的最终目标,即禁用保存但不保存?
提前感谢您提供的任何建议。
答案 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
事件,则可能会这样做。