通过VBA显示“另存为”对话框时取消操作出现运行时错误

6

我有一个宏,可以以特定的方式格式化文档,然后使用ActiveDocument.Save保存。

但是,有时文档尚未保存,在某些情况下我不想保存它。不幸的是,当显示“另存为”对话框时,单击“取消”会导致运行时错误(4198)-

命令失败

有人知道如何防止发生这种情况吗?谢谢。


那么在某些情况下,您确实希望允许“另存为”吗? - brettdj
1
是的,这应该由用户决定。谢谢。 - David Gard
我已经更新以处理您修改后的问题。 - brettdj
然而,经过更多的阅读,我并不确定这是否可以实现。看起来我要么必须选择完全不使用SaveAs(也许警告用户手动保存),要么选择On Error路线。可悲的是,为了实现我想要的功能,必须选择On Error,这并不是一件好事! - David Gard
不要...读我的更新帖子 :) - brettdj
刚测试过,运行正常,非常感谢。 - David Gard
3个回答

3
请尝试添加一些错误处理指令,以解决以下问题:
On Error Resume Next    'to omit error when cancel is pressed
   ActiveDocument.Save

If Err.Number <> 0 Then   'optional, to confirmed that is not saved
   MsgBox "Not saved"      
End If
On Error GoTo 0         'to return standard error operation

1
谢谢您的回复。虽然我知道在VBA中可以跳过错误,但如果可能的话,我更愿意了解为什么会出现错误,并通过其他方式解决它。不过如果必要的话,我也会使用这种方法。 - David Gard
我知道的是,VBA并没有为一些用户操作提供简单的解决方案,比如你的例子或者在Excel VBA中使用Application.Inputbox时遇到的非常普遍的取消按钮问题。因此,需要一些其他的VBA实现... - Kazimierz Jawor
@kaz Jaw,那不正确,有一种简单的解决方案而无需错误处理。 - brettdj
@KazJaw - 我深有体会!有些本应简单的事情却并非如此。尽管错误处理很棒,但VBA似乎过于依赖它来完成一些本应具备内置“退出”的任务。我目前已经实现了上述方法,但如果你找到其他解决方案,希望你能够分享。谢谢。 - David Gard

2

更新:现在

1. 检查文件是否已经保存过
2. 如果文件未保存,使用受控进程显示SaveAs对话框以保存文件或处理Cancel

代码

Dim bSave As Boolean
If ActiveDocument.Path = vbNullString Then
bSave = Application.Dialogs(wdDialogFileSaveAs).Show
If Not bSave Then MsgBox "User cancelled", vbCritical
Else
ActiveDocument.Save
End If

谢谢@bredttdj,但恐怕这个方法不行。编译错误:期望函数或变量,.save 被指定为有问题的代码片段。 - David Gard
@DavidGard 虽然这段代码在我这里没有出现任何错误,但是我应该测试的是 Path 的存在而不是 Saved。请尝试使用上述代码。 - brettdj
抱歉,我误读了你的代码。.saved确实有效,但恐怕你误解了我的问题(现在正在编辑以使其更清晰)。有时用户会想要使用“另存为”对话框保存之前未保存的文档,有时则不需要。因此,如果文档尚未保存,则无法跳过它。我意识到我可以询问用户是否希望保存,但这仍然给他们按“取消”的选项,所以我又回到了起点。谢谢。 - David Gard
1
@brettdj - 经过测试,一切正常,非常感谢您在解决这个问题上的帮助。 - David Gard

0

针对VSTO开发人员,请前往此处

    if (Globals.ThisAddIn.Application.ActiveDocument.Path == String.Empty)
        {
            Word.Dialog dlg;
            Object timeout = 3000;
            dlg = Globals.ThisAddIn.Application.Dialogs[
                Word.WdWordDialog.wdDialogFileSaveAs];
            int result = dlg.Display(ref timeout);
        }
        else
        {
            Globals.ThisAddIn.Application.ActiveDocument.Save();
        }

结果将存储哪个按钮被按下了(0- 取消,1- 确定,2- 关闭)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接