嵌入式 Word 文档的后期绑定与早期绑定

Late Binding vs. Early Binding with Embedded Word Documents

我在旧版本的 MS Office 上将我的嵌入文档 运行 时遇到问题。我认为问题在于我如何声明我的对象,但不确定如何使用后期绑定声明我的嵌入式文档(我对这个概念和 vba 仍然很陌生)。下面是我目前如何进行变量声明以及一段代码。它在 Excel 2013 年运行良好,但在 2010 年不起作用,因为我声明变量的方式(我相信)。

Dim oDoc As Word.Document
Dim oTemplate As Word.Document
Dim wdObj As OLEObject
Dim wdObj2 As OLEObject

'Deselect anything selected
Range("A1").Select

'Copy content of template
Set wdObj = Sheets("Template").OLEObjects("Template")
wdObj.Activate
Set oTemplate = wdObj.Object
oTemplate.Content.Copy

'Initialize letter document
Set wdObj2 = Sheets("Report").OLEObjects("Letter")
wdObj2.Activate
Set oDoc = wdObj2.Object

'Erase contents and replace with clean template
oDoc.Content.Delete

oDoc.Range.PasteAndFormat _
    wdFormatOriginalFormatting

我已经尝试设置 oDoc 和 oTemplate 它们 "As Object" 但我不确定如何 link 它们返回到一个词对象。这样做只会导致库引用在 PasteAndFormat 调用的 "wdFormatOriginalFormatting".

上失败

我一直在绞尽脑汁想弄明白这个问题。任何帮助将不胜感激。谢谢!

首先,确保您在代码模块中使用 Option Explicit。然后,当您尝试编译时,它应该提醒您注意 wdFormatOriginalFormatting.

的问题

为什么?

wdFormatOriginalFormatting 是 Word 对象模型中的枚举常量。 Excel 中不存在,除非您使用早期绑定。

解决方案

当您使用后期绑定时,您需要声明这些常量并为其赋值,因为它们在编译时或 运行 时是未知的:

Const wdFormatOriginalFormatting as Long = 16

那么,这一行应该不会导致错误:

oDoc.Range.PasteAndFormat _
    wdFormatOriginalFormatting

使用后期绑定,您不能使用任何预定义的早期绑定常量,因为在 Dim 时,它不知道您指的是哪个对象(这是早期绑定的优势)...另一方面,您不需要创建对库的引用。

现在将 OLE 对象 (Word) 链接回文档对象 ...

对于嵌入的对象,你要反过来......通常你会先 create/open 应用程序,然后是应用程序中的文档......在这里我们使用 OLE 动词来立即打开嵌入式文档,然后抓住应用程序...

Sub LateBinding()
Dim WApp As Object
Dim wdobj As Object
Dim wdOLE As OLEObject

    ' create a reference to the OLE object
    Set wdOLE = ActiveSheet.OLEObjects(1)

    ' open the OLE object using its application (whatever that is)
    wdOLE.Verb xlVerbPrimary

    ' create a reference to the real object inside the OLE object
    Set wdobj = wdOLE.Object

    ' create a reference to the application used by wdobj
    Set WApp = wdobj.Application

    ' start using the application ... let's move the cursor a bit
    ' hoping it is REALLY a WORD type of object ... we could test that before of course
    ' note we cannot use predefined WORD constants here, hence Unit and Count 
    WApp.Selection.MoveDown Unit:=5, Count:=1


End Sub

现在 OLE 对象链接(返回)到真实的文档对象和(返回)它的应用程序。

希望这就是您想知道的...