用VBA直接在WORD中能正常运行的方法或属性相关常量设置,在EXCEL中处理WORD文档时有哪些变化?

事例说明:
在EXCEL中用VBA操作WORD文档时, VBA代码编辑过程中,不直接引用Microsoft Word 11.0 Object Library对象,采用后期绑定Set wordAppl = CreateObject("Word.Application") 定义一个Word对象变量方法为前提,对WORD相应对象的方法、属性操作。
现象及问题:
直接在WORD中正确运行的代码,在EXCEL VBA中如果运行但没有正确结果、或者根本不能运行。
具体事例:
⑴对WORD文档设置段落属性——水平居中
代码:
.ParagraphFormat.Alignment = wdAlignParagraphCenter
效果对比:
直接在WORD中运行代码,水平居中正确。
在EXCEL中运行通过(没有任何信息提示),但是没有水平居中效果。
⑵文档统计属性——计算行数
代码:
wdLines =.BuiltInDocumentProperties(wdPropertyLines)
效果对比:
直接在WORD中运行,正确,有明确的数据值。
在EXCEL中运行不能通过,提示信息为“无效的过程调用或参数”。
…………
问题需求:
把直接在WORD中用VBA处理文档的常规方法或属性涉及的常量定义,如果使用在EXCEL的VBA中设置时,对应变化有哪些?请对应罗列并用中文注释。
恭请高手指点迷津……
谢谢!

前期绑定的好处在于,由该绑定类库所引申出来的常数、对象、属性和方法,都可以被直接应用。

对于wdPropertyLines和wdAlignParagraphCenter这些常数,如果在前期绑定时,那么这些常数就和其对应的值一一对应了,因为在类库的内部,已经对这些常数进行了定义和赋值。

 

然而通过后期绑定Set wordAppl = CreateObject("Word.Application")这种方法引用的word对象,仅仅wordAppl这个实例才拥有各种属性和方法。然而Microsoft Word 11.0 Object Library这个类库所包含的word.application仅仅只是其中的一个对象,wdPropertyLines和wdAlignParagraphCenter在这个类库中,但并不一定在word.application这个对象中。

 

而且,你的excel因为没有引用Microsoft Word 11.0 Object Library,所以计算机就不能识别,于是产生错误。

 

解决办法,你打开一个Word文档,然后在Word中通过 :

Sub xx()
    Msgbox wdAlignParagraphCenter   '弹出值为:1
    MsgBox wdPropertyLines  '弹出值为:23
End Sub

然后,你在Excel中,使用如下代码:

.ParagraphFormat.Alignment = 1    '1 = wdAlignParagraphCenter
wdLines =.BuiltInDocumentProperties(23)   '23 = wdPropertyLines

你可以一试,希望能够正确,并对你有帮助!!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-22

(1)对WORD文档设置段落属性——水平居中

      这个问题你好像单独问过了,把那个常量改为1就可以正常运行

⑵文档统计属性——计算行数

      没有看到你的完整代码,我下面这段代码供你参考。需要注意的是,在新建(或者打开)一个文档的时候要定义一个变量来引用这个新建(或打开)的文档对象,BuiltInDocumentProperties函数是文档对象的函数,而不是Word.Application对象的函数。

Set wordAppl = CreateObject("Word.Application")
With wordAppl
    .Visible = True
    Set WDDOC = .Documents.Add '这里定义一个文档对象并赋值
    .Selection.TypeText Text:="键入你想要键入的内容"
    '在这里进行更多你想要完成的操作
    wdlines = WDDOC.BuiltinDocumentProperties(23) '注意这行的修改
    MsgBox (wdlines)
End With
Set wordAppl = Nothing
Set WDDOC = Nothing

总结:unsamesky关于常量对应修改的方法挺好,涉及到代码中引用常量时可以用这个办法来解决;另外,With..End With代码段内写代码的时候要注意调用的函数是不是你所With的对象的函数,若不是则需要明确指明对象名。

相似回答