Word VBA应用程序退出问题

3
If (Documents.count = 1) And (ActiveDocument.Name = ThisDocument.Name) Then
    Application.DisplayAlerts = False
    Application.Quit (wdDoNotSaveChanges)
Else
    Application.DisplayAlerts = False
    ActiveDocument.Close (wdDoNotSaveChanges)
End If

我在以上代码中有问题,即当代码清除第一个If语句(意味着它是唯一打开的文档并且文档名称符合预期)时,它仍然无法完全关闭Word应用程序。相反,它只会关闭文档,然后留下一个“空白”的Word窗口。
我知道它正在清除第一个If语句,因为我向调试文件快速检查了每个元素,而且所有内容都按预期显示出来。此外,如果我逐步执行代码,它确实按照应该移动。
有趣/令人沮丧的是,如果我在调试模式下逐步执行代码并到达应用程序退出代码部分,它确实可以退出整个程序!所以我真的不确定为什么当我只运行代码而不是逐步执行它时它不起作用。
尝试过:
1 - 在Application.Quit之后添加“Exit Sub”行
2 - 显式将Word应用程序设置为对象:
Dim wObj  As Object
Set wObj = CreateObject("word.Application")
'Application.Quit (wdDoNotSaveChanges) '
wObj.Quit (wdDoNotSaveChanges)
Set wObj = Nothing

3 - 添加一个“before close”事件:

Sub DocumentBeforeClose()
ActiveDocument.Saved = True
End Sub

任何帮助都将不胜感激!

1
如果您正在使用后期绑定,很可能找不到wdDoNotSaveChanges的枚举。我认为您不需要使用它,只需使用“ActiveDocument.Close False”。对于应用程序也是如此,“Application.Quit False”。 - Ryan Wildry
1
你能解释一下 if 条件应该检查什么吗?还能解释一下 ThisDocument 是什么吗?看起来你进入了 else 分支。 - Dirk Vollmar
1
我无法复制这个问题 - 从宏菜单和调试器中,两个代码分支都按预期运行。这是在事件处理程序中吗? - Comintern
1
@DirkVollmar ThisDocument 是 Word VBA 对象引用,指向包含正在执行的 VBA 代码的文档。如果只有一个文档处于打开状态且它就是包含代码的文档,则该子程序应该退出 Word;否则,它应该只关闭打开的文档。 - Dave
1
@Dave:谢谢你的解释,但我想知道在这种特定情况下ThisDocument是什么。我之前表达得不够清楚,抱歉... - Dirk Vollmar
显示剩余5条评论
2个回答

0

在Excel中遇到这个问题时,我发现在调用Application.Quit后必须告诉Excel关闭所有文档。

  • 因为Excel可以保留对窗口关闭后任何工作簿的引用(工作簿仍然存在于VBA编辑器中,未释放的对象引用)...
  • 因为我不能总是知道我的文档是此Excel实例中打开的第一个文档...
  • 因为我必须接受一个Excel插件的存在,该插件会导致工作簿在保存后立即出现修改(由于不可见的工作簿属性更改)...
  • 因为我的用例需要退出Excel...

适用于Microsoft Word:

'Actual handling of unsaved documents omitted from this answer
If savedAllDocuments Or UserDoesNotCare Then
    Application.Quit wdDoNotSaveChanges
    Dim doc As Document
    For Each doc in Application.Documents
        doc.Close SaveChanges:=False
    Next doc
End If

0

我曾遇到过与 Application.Quit 相关的问题(在 Excel 宏中退出 Word)。事实证明,它与 Application.ScreenUpdating 的状态有关。当 Excel 的 ScreenUpdating 被设置为 false 时,宏会挂起,但使用以下设置可以正确继续:

Application.ScreenUpdating = True

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