You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA代码每第二次运行时报错「远程服务器不存在或不可用」原因求解

故障原因

  • 核心问题是未限定的全局对象调用+COM对象未正确释放,导致隔次运行时VBA试图访问已经失效的Word实例:
    1. 代码中ActiveDocument.Content.InsertAfter没有显式绑定到你创建的WrdDoc实例,Excel VBA中直接调用ActiveDocument会默认调用Word的全局对象,第一次运行时该全局对象指向你新建的Word文档,运行结束后该引用没有被释放,第二次运行时全局对象指向的旧实例已经失效,就会触发「远程服务器不存在或不可用」报错,第三次运行时失效引用被系统自动清理,所以恢复正常,形成隔次报错的规律。
    2. 代码运行完成后没有手动销毁Word应用、文档对象,也没有退出Word的逻辑,每次运行都会残留一个WINWORD.EXE后台进程,进一步加剧COM引用冲突。

修正后的代码

Sub to_word()
    Dim WrdApp As Word.Application
    Dim WrdDoc As Word.Document
    Dim a As Long, i As Long ' 强制声明变量避免隐式变体错误
    
    On Error GoTo ErrHandler ' 加错误捕获,即使运行出错也能释放对象
    
    Set WrdApp = New Word.Application
    WrdApp.Visible = True
    WrdApp.Activate
        
    Set WrdDoc = WrdApp.Documents.Add
    a = Worksheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 6 To a
        If i = 9 Then
            WrdApp.Selection.Font.Bold = True
            WrdApp.Selection.Font.Underline = True
            ' 替换原来的ActiveDocument,显式绑定到当前创建的WrdDoc
            WrdDoc.Content.InsertAfter Text:=("Text" & vbNewLine)
        End If
        
        If Worksheets("Tabelle1").Cells(i, 5).Value = "Ja" Then
            Worksheets("Tabelle1").Cells(i, 4).Copy
            WrdDoc.Characters.Last.PasteSpecial xlPasteValues
        End If
    Next
    
ExitHandler:
    ' 运行完成后手动释放COM对象
    If Not WrdDoc Is Nothing Then Set WrdDoc = Nothing
    If Not WrdApp Is Nothing Then Set WrdApp = Nothing
    Exit Sub
    
ErrHandler:
    MsgBox "运行出错:" & Err.Description, vbCritical
    Resume ExitHandler
End Sub

额外优化建议

  • 如果不需要每次运行都新建Word实例,可以复用已打开的Word进程,先判断GetObject(, "Word.Application")是否存在,存在就直接用,不存在再新建,减少进程残留概率。
  • 如果需要运行结束后自动关闭新建的Word文档,可以在释放对象前添加WrdDoc.SaveAs2 "你的保存路径"、WrdDoc.Close、WrdApp.Quit逻辑。

内容的提问来源于stack exchange,提问作者Mazze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:24:03