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

Detect if an object has been disconnected from its clients

我在自动执行 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 检测到该子例程中发生错误,我会在我调用 Err1:

的标签中从 Excel 关闭 Word 文档和 Word 应用程序
    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 and/or wordDoc 变量仍然引用 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:

查看后,我意识到上面给出的错误仅在文档(wordDoc) 是断开连接的对象时发生。如果断开连接的是 Word 应用程序 (wordApp),我会收到以下错误:

Run-time error '462':

The remote server machine does not exist or is unavailable

考虑以下示例:

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

似乎是对变量的任何类型检测,它引用了固有的 Word 对象,如 .Documents.Windows.RecentFiles 等,在文档关闭或应用程序后立即进行退出命令已被调用,可能会引发错误 14:字符串不足 space,而 Word 应用程序正在处理该命令。 Applicationobject 上的相同检测,也可能挂起 Excel 应用程序。

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