检测对象是否与客户端断开连接

我在自动化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") 

然后我调用Word文档中的一个子例程,从Excel文件中传递一些数据:

  Call wordApp.Run("StartWithData", variable1, variable2) 

如果Excel检测到在该子例程中发生错误,我将从Excel中closuresWord文档和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 

在正常情况下,这样做是完美的。 但是,如果在执行Err1标签(如用户手动closures文档)之前closuresWord文档或应用程序,则会出现以下错误:

运行时错误“-2147417848(80010108)”:
自动化错误被调用的对象与客户端断开连接。

这是非常有意义的,因为wordApp和/或wordDocvariables仍然引用Application和Document对象,并且这些对象不再存在(但也不被认为是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的回答后 ,我意识到上面给出的错误只发生在文档( wordDoc )是断开对象的时候。 如果Word应用程序( wordApp )是断开连接,我得到以下错误:

运行时错误“462”:

远程服务器机器不存在或不可用

考虑下面的例子:

 Sub Test() Dim wordApp As Object Dim wordWnd As Object Dim wordDoc As Object Set wordApp = CreateObject("Word.Application") Set wordWnd = wordApp.Windows ' choose any object property as indicator wordApp.Visible = True ' debug Set wordDoc = wordApp.Documents.Open(Application.ActiveWorkbook.Path & "\test.doc") MsgBox IsObjectDisconnected(wordWnd) ' False with opened document wordDoc.Close MsgBox IsObjectDisconnected(wordWnd) ' False with closed document wordApp.Quit ' disconnection MsgBox IsObjectDisconnected(wordWnd) ' True with quited application End Sub Function IsObjectDisconnected(objSample As Object) As Boolean On Error Resume Next Do IsObjectDisconnected = TypeName(objSample) = "Object" If Err = 0 Then Exit Function DoEvents Err.Clear Loop End Function 

似乎任何types检测的variables,引用内部的Word对象,如文档closures或应用程序退出命令后立即作出的.Documents.Windows.RecentFiles等,可能会抛出错误14:退出string空间,而Word应用程序处理命令。 Application对象上的相同检测,也可能会挂起Excel应用程序。

在示例中, TypeName()调用被包装到OERN循环中,它应该跳过不相关的结果, 以获取显式断开反馈,依赖于types名称 ,而不是错误编号。 为了避免挂起,正在检查.Windows属性而不是Application