我遇到了自动化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':
远程服务器计算机不存在或不可用
答案 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
。