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

时间:2015-11-13 20:17:54

标签: excel vba excel-vba runtime-error

我遇到了自动化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

这在正常情况下完全正常;但是,如果在执行Err1标签之前关闭Word文档或应用程序(例如用户手动关闭文档),则会出现以下错误:

  

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

这非常有意义,因为wordApp和/或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:

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

  

运行时错误'462':

     

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

1 个答案:

答案 0 :(得分:3)

考虑以下示例:

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:字符串空间,而Word应用程序处理命令。 Application对象上的相同检测也可能会挂起Excel应用程序。

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