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

时间:2015-02-24 13:44:10

标签: vba excel-vba late-binding early-binding excel

我在使用旧版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"但我不确定如何将它们链接回一个单词对象。这样做只会导致库引用在PasteAndFormat调用" wdFormatOriginalFormatting"上失败。

我一直在试图弄清楚我的头发。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

首先,确保您在代码模块中使用Option Explicit。然后,当您尝试编译时,它会提醒您wdFormatOriginalFormatting的问题。

为什么?

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

<强>解决方案

使用后期绑定时,需要声明并为这些常量赋值,因为它们在编译时或运行时都不知道:

Const wdFormatOriginalFormatting as Long = 16

然后,这一行不应该导致错误:

oDoc.Range.PasteAndFormat _
    wdFormatOriginalFormatting

答案 1 :(得分:1)

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

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

对于嵌入式对象,你会反过来...通常你会首先创建/打开应用程序,然后是应用程序中的文档...这里我们使用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对象链接(返回)到真实文档对象和(返回)其应用程序。

希望这是你想知道的......