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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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

你可以一试,希望能够正确,并对你有帮助!!
参考技术A

(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的对象的函数,若不是则需要明确指明对象名。

使用 vba 在 word 2010 中的现有内容控件之后添加内容控件

【中文标题】使用 vba 在 word 2010 中的现有内容控件之后添加内容控件【英文标题】:Add a content control after an existing content control in word 2010 using vba 【发布时间】:2012-09-02 21:02:51 【问题描述】:

更多细节:

    我正在将(大量)带有内容控件的文档插入到单个文档中。 每个文档中的一个内容控件是一个标题控件(链接到文档属性),它自然会收到与插入时目标文档的标题相同的值。 使用 word 或 vba 重命名控件的标题和/或标签并不能解决问题(奇怪!) 我建议的解决方案是创建一个具有不同名称的新控件,从原始标题控件复制 .range.text,然后删除标题控件。

我有一个循环,它遍历所有需要更改的文件,效果很好。但是,无论我做什么,我创建的任何新控件都出现在文档的开头,而不是在正确的位置(前面有一个带有文档代码的控件)。

想法?顺便说一句,更改控件名称不起作用是否有任何合乎逻辑的原因?

当前代码:

Sub FieldChanger()

Dim docCur As Document
Dim strCurPath As String
Dim strCurFile As String
Dim rngTitle As Range
Dim strTitle As String
Dim ccName As ContentControl

strCurPath = "C:\Users\User\Desktop\BGS\Final\"
strCurFile = Dir(strCurPath & "*.docx")

Do While strCurrentFile <> ""
    Set docCur = Application.Documents.Open(strCurPath & strCurFile)
        With docCur.ContentControls
            .Item(1).LockContents = False //Unlock outer content control
            Set rngTitle = .Item(3).Range
            strTitle = rngTitle.Text
            rngTitle = rngTitle.Move(wdCharacter, 1)
            ccName = rngTitle.ContentControls.Add(wdContentControlRichText) //This line throws a 4198 error
            ccName.Title = "ccName"
            ccName.Tag = "ccName"
            ccName.Range = strTitle
            ccName.LockContentControl = True
            .Item(3).LockContentControl = False
            .Item(3).Delete
            .Item(1).LockContents = True //Lock outer content control
        End With
    docCur.Save
    docCur.Close
    strCurFile = Dir
Loop

End Sub

【问题讨论】:

通常会,但没想到我会用上面的代码去任何地方。曾尝试使用 docCur.ContentControls.Add 添加项目,但这会将其放在文档的开头(不记得确切但可能在上面的分组内容控件 .Item(1) 之前将其转储) 【参考方案1】:

顺便说一句,更改控件名称不起作用是否有任何合乎逻辑的原因?

内容控制 (CC) 名称只是一个名称。从“标题”重命名 CC 不会改变 Word 从何处获取内容。将抄送命名为“标题”也不会导致 Word 将文档的标题字符串放入抄送中。如果您创建一个空文档,请插入 Title 文档属性(作为 CC)并查看

的值

activedocument.ContentControls(1).XMLMapping.XPath

你可能会看到价值

/ns1:coreProperties[1]/ns0:title[1]

这就是告诉 Word 它需要将 Title 内置文档属性的值放在 CC 中,以及去哪里获取它的原因。您可以使用相同的机制将您自己的纯文本 CC 链接到内置属性,或者您可以将它们链接到您自己的“自定义 XML 部分”中的节点。但它们不必与任何东西相关联。

至于代码,更像这样的代码怎么样(注意,我也将“strCurrentFile”更改为 strCurFile)。我想知道您是否真的需要重新插入 CC 值作为新的 CC(即为什么不直接删除 CC 并将其现有值保留在那里)但假设您需要 CC。

注意,作为 VBA 中的一般规则,在设置范围变量和 CC 等对象的值时,您需要使用 Set 关键字。理论上,当您完成对象时,您还应该将对象设置为 Nothing(例如 Set rngTitle = Nothing)。我没有在这里添加那些东西。在 VB.NET 中,您不需要做任何这些事情。

Dim docCur As Document
Dim strCurPath As String
Dim strCurFile As String
Dim rngTitle As Range
Dim strTitle As String
Dim ccName As ContentControl

strCurPath = "C:\a\test\"
strCurFile = Dir(strCurPath & "*.docx")

Do While strCurFile <> ""
    Set docCur = Application.Documents.Open(strCurPath & strCurFile)
        With docCur.ContentControls
            .Item(1).LockContents = False 'Unlock outer content control
            Set rngTitle = .Item(3).Range
            strTitle = rngTitle.Text
            ' we need the following line to ensure that deleting the range
            ' does not remove the CC prematurely
            .Item(3).Temporary = False
            rngTitle.Delete
            rngTitle.Collapse wdCollapseStart
            ' Delete the control here instead of later
            .Item(3).LockContentControl = False
            .Item(3).Delete
            Set ccName = rngTitle.ContentControls.Add(wdContentControlRichText) 
            ccName.Title = "ccName"
            ccName.Tag = "ccName"
            ccName.Range = strTitle
            ccName.LockContentControl = True
            .Item(1).LockContents = True 'Lock outer content control
        End With
    docCur.Save
    docCur.Close
    strCurFile = Dir
Loop

评论合并...

有些插件可能会有所帮助,例如cctw.codeplex.com 上的数据绑定工具包(最近没有检查该链接)

【讨论】:

工作得很好,谢谢!认为有某种控件绑定。可惜不能在对话框中设置 - 我当然可以想到能够在 word 中设置绑定而不是使用 vba 会很有用的情况。

以上是关于用VBA直接在WORD中能正常运行的方法或属性相关常量设置,在EXCEL中处理WORD文档时都有哪些变化?的主要内容,如果未能解决你的问题,请参考以下文章

Word VBA里面的ListBox怎么设置?

如何让VBA自动响应word或excel打开文件时自动出现的消息框

Qt Creator写的小程序在Creator软件中能运行,但在目录当中直接点击EXE运行不了。

Word VBA 的主要对象体系结构是怎样的?编辑中常用对象都有哪些?

用vba编程将excel中的数据批量填写到word里面

关于 word VBA的宏运行 输入文本的代码 急求 谢谢