检测对象是否已与其客户端断开连接
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 应用程序正在处理该命令。 Application
object 上的相同检测,也可能挂起 Excel 应用程序。
在示例中 TypeName()
调用被包装到 OERN 循环中,应该跳过不相关的结果 以获得明确的断开连接反馈,依赖于类型名称,但不是错误编号。为避免挂起,正在检查 .Windows
属性 而不是 Application
。
我在自动执行 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
:
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 应用程序正在处理该命令。 Application
object 上的相同检测,也可能挂起 Excel 应用程序。
在示例中 TypeName()
调用被包装到 OERN 循环中,应该跳过不相关的结果 以获得明确的断开连接反馈,依赖于类型名称,但不是错误编号。为避免挂起,正在检查 .Windows
属性 而不是 Application
。