VBA代码每第二次运行时报错「远程服务器不存在或不可用」原因求解
故障原因
- 核心问题是未限定的全局对象调用+COM对象未正确释放,导致隔次运行时VBA试图访问已经失效的Word实例:
- 代码中
ActiveDocument.Content.InsertAfter没有显式绑定到你创建的WrdDoc实例,Excel VBA中直接调用ActiveDocument会默认调用Word的全局对象,第一次运行时该全局对象指向你新建的Word文档,运行结束后该引用没有被释放,第二次运行时全局对象指向的旧实例已经失效,就会触发「远程服务器不存在或不可用」报错,第三次运行时失效引用被系统自动清理,所以恢复正常,形成隔次报错的规律。 - 代码运行完成后没有手动销毁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
相关产品推荐
相关产品推荐

