症状
运行使用自动化控制 Microsoft Word的 Microsoft Visual Basic 代码时,可能会收到以下错误消息之一:
错误消息 1运行时错误“-2147023174” (800706ba)
自动化错误错误消息 2
运行时错误“462”:远程服务器计算机不存在或不可用
原因
Visual Basic 已建立对Word的引用,因为有一行代码调用Word对象、方法或属性,但未使用Word对象变量对其进行限定。 在结束程序之前,Visual Basic 不会发布此引用。 多次运行代码时,此错误引用会干扰自动化代码。
解决方法
修改代码,以便使用相应的对象变量限定对Word对象、方法或属性的每次调用。
状态
此行为是设计使然。
更多信息
若要自动Word,请建立一个对象变量,该变量通常引用 Word Application 或 Document 对象。 然后,可以将其他对象变量设置为引用 Selection、Range 或Word对象模型中的其他对象。 编写代码以使用 Word 对象、方法或属性时,应始终在调用前使用相应的对象变量。 否则,Visual Basic 将使用隐藏的全局变量引用,该引用设置为当前正在运行的实例。 如果关闭Word,或者释放声明的对象变量,则隐藏的全局变量现在将引用无效 (销毁) 对象。 再次运行自动化代码时,对此隐藏对象变量的调用将失败,并出现上述错误。
以下步骤演示了如何重现此问题以及如何更正此问题。重现行为的步骤
-
在 Visual Basic 中启动新的标准 EXE 项目。 默认情况下,将创建 Form1。
-
单击“项目”菜单中的“引用”,然后单击以下选项之一:
-
对于 Office Word 2007,请单击 Microsoft Word 12.0 对象库
-
对于 Word 2003,请单击 Microsoft Word 11.0 对象库
-
对于 Word 2003,单击“Microsoft Word 10.0 对象库”
-
对于 Word 2000,请单击“Microsoft Word 9.0 对象库”。
-
对于 Word 97,请单击“Microsoft Word 8.0 对象库”。
-
-
在 Form1 上放置 CommandButton。
-
将以下代码复制到 Form1 的代码窗口:
Option Explicit Private Sub Command1_Click() Dim oWord As Word.Application Dim oDoc As Word.Document Dim oRange as Word.Range Set oWord = CreateObject("Word.Application") With oWord .Visible = True .Activate .WindowState = wdWindowStateNormal End With Set oDoc = oWord.Documents.Add MsgBox "Document open", vbMsgBoxSetForeground With oDoc .PageSetup.LeftMargin = InchesToPoints(1.25) End With ' This example inserts text at the end of section one. Set oRange = ActiveDocument.Sections(1).Range With oRange .MoveEnd Unit:=wdCharacter, Count:= -1 .Collapse Direction:=wdCollapseEnd .InsertParagraphAfter .InsertAfter "End of section." End With With oDoc .Saved = True End With Set oRange = Nothing Set oDoc = Nothing oWord.Quit Set oWord = Nothing End Sub
-
在 “运行 ”菜单上,单击“ 开始 ”或按 F5 键启动程序。
-
单击 CommandButton。 不发生错误。 但是,已创建对Word的引用,但尚未发布。
-
再次单击 CommandButton,并注意收到前面所述的错误。
注意 发生此错误的原因是代码引用 InchesToPoints 方法,而不使用 oWord 对象变量在调用之前。 -
停止项目并更改以下行:
.PageSetup.LeftMargin = InchesToPoints(1.25)
-自-
.PageSetup.LeftMargin = oWord.InchesToPoints(1.25)
-
再次运行程序。 然后,单击“CommandButton”。 不发生错误。
-
再次单击 CommandButton,并注意收到错误。
注意 发生此错误是因为代码引用 ActiveDocument Section 一个的 Range 对象,而不使用 oWord 对象变量在调用之前。 -
停止项目并更改以下行:
Set oRange = ActiveDocument.Sections(1).Range
-自-
Set oRange = oWord.ActiveDocument.Sections(1).Range
-
再次运行程序。 请注意,可以多次运行代码,而不会出错。
生成自动化Word的 Visual Basic 项目时,如果项目引用了 Microsoft Word 对象库,则 Word 对象模型的对象、方法和属性的示例代码可从 Word 帮助文件中获取。 当光标位于代码中的某个关键字上时,你将通过按 F1 键看到任何适用的帮助文本。
帮助主题中的示例代码将是 Microsoft Word Visual Basic for Applications代码。 它不会显示 Visual Basic 代码所需的对象引用。 需要根据需要添加限定符。参考
有关其他信息,请参阅 Microsoft 知识库中的以下文章:
178510 PRB:对象“_Global”的 Excel 自动化方法失败
有关 Office 应用程序自动化的其他信息,请单击下面的序列号以查看 Microsoft 知识库中的文章: