我在自动化Excel文件时遇到问题。在Excel中VBA脚本首先打开Word应用程序和Word文档:检测对象是否与客户端断开连接
Dim wordApp As Object
Set wordApp = CreateObject("Word.Application")
vPath = Application.ActiveWorkbook.Path
Set wordDoc = wordApp.Documents.Open(vPath & "\test.doc")
然后我打电话从Excel文件通过一些数据的Word文档中的子程序:
Call wordApp.Run("StartWithData", variable1, variable2)
如果Excel检测发生错误在子程序中,我关闭从Excel的Word文档和Word应用中的标签我称之为Err1
:
On Error Goto Err1
'all the code from above
Exit Sub
Err1:
wordDoc.Close wdCloseWithoutSaving
wordApp.Quit SaveChanges:=wdDoNotSaveChanges
Set wordDoc = Nothing
Set wordApp = Nothing
这工作完全正常ü正常情况下;但是,如果Word文档或应用程序是在Err1
标签执行之前关闭(如用户手动关闭文档),我收到以下错误:
Run-time error '-2147417848 (80010108)':
Automation error The object invoked has disconnected from its clients.
这是非常合情合理的,因为wordApp
和/或wordDoc
变量仍然引用应用程序和文档对象,并且这些对象不再存在(但也不被认为是Nothing
)。
所以,这里是我的查询:有没有办法检查是否有一个对象已经从运行时错误发生之前已断开其客户端,以避免依赖于on error resume next
?
Such as:
If Not isDisconnected(wordDoc) Then
wordDoc.Close wdCloseWithoutSaving
End If
If Not isDisconnected(wordApp) Then
wordApp.Quit SaveChanges:=wdDoNotSaveChanges
End If
更新1:
看着omegastripes' answer后,我意识到,当文档(wordDoc
)是断开了对象上面仅给出的错误发生。如果Word应用程序(wordApp
)是什么断开了,我得到以下错误:
Run-time error '462':
The remote server machine does not exist or is unavailable
为什么你不检查错误对象? 'Err.Number'或'Err.Description' - 如果对象因为关闭而断开连接,那么没有什么可检查 - 所以你不能检查它。 –
@MacroMan这是一个很好的想法;然而,所引发的错误是错误440:“自动化错误”,它将由于几种不同的原因而被抛出,包括被断开连接的对象以及远程过程调用(Word的子例程)中发生的任何错误。 – Jonathan
我想你可以检查Word应用程序是否仍在运行(这很简单),但检查是否有连接断开将会非常棘手,如果可能的话,它没有连接的事实意味着它是属性和方法无法访问。只有其他的东西你可以尝试看看'wordApp'对象是否返回'Nothing' –