gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:14:54 27 4
gpt4 key购买 nike

我在自动化 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 文档或应用程序(例如用户手动关闭文档),我会收到以下错误:

Run-time error '-2147417848 (80010108)':
Automation error The object invoked has disconnected from its clients.

这非常有意义,因为 wordApp 和/或 wordDoc 变量仍然引用 Application 和 Document 对象,并且这些对象不再存在(但也不被认为是是什么都没有)。

所以这是我的询问:有没有一种方法可以在运行时错误发生之前检查对象是否已与客户端断开连接,以避免必须依赖on errorresume 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),我会收到以下错误:

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

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

关于vba - 检测对象是否已与其客户端断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com