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

时间:2012-09-02 21:02:52

标签: word-vba word-2010

更多细节:

  1. 我将带有内容控件的(大量)文档插入到单个文档中。
  2. 每个文档中的一个内容控件是一个标题控件(链接到文档属性),它自然会在插入时获得与目标文档标题相同的值。
  3. 使用word或vba重命名控件的标题和/或标签并不能解决问题(很奇怪!)
  4. 我建议的解决方案是创建一个具有不同名称的新控件,从原始标题控件复制.range.text然后删除标题控件。
  5. 我有一个循环,遍历所有需要更改的文件,工作正常。但是,无论我做什么,我创建的任何新控件都出现在文档的开头而不是正确的位置(有一个控件,前面有文档的代码)。

    想法?顺便说一下,为什么更改控件名称不起作用有任何合理的原因?

    当前代码:

    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
    

1 个答案:

答案 0 :(得分:2)

  

顺便说一下,为什么更改控件名称不起作用有任何合理的理由?

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

的值

activedocument.ContentControls(1).XMLMapping.XPath

您可能会看到值

/ NS1:coreProperties [1] / NS0:标题[1]

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

至于代码,更像是这样的东西(NB,我也将“strCurrentFile”更改为strCurFile)。我想知道你是否真的需要重新插入CC值作为一个新的CC(即为什么不只是删除CC并保留其现有值),但假设你需要CC。

注意,作为VBA的一般规则,在设置范围变量和CC等对象的值时,需要使用Set关键字。理论上,您还应该在完成对象后将对象设置为Nothing(例如,设置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上的数据绑定工具包(最近未检查该链接)