1

更详细一点:

  1. 我将(大量)带有内容控件的文档插入到单个文档中。
  2. 每个文档中的内容控件之一是标题控件(链接到文档属性),它自然会接收与插入时目标文档的标题相同的值。
  3. 使用 word 或 vba 重命名控件的标题和/或标记并不能解决问题(奇怪!)
  4. 我建议的解决方案是创建一个具有不同名称的新控件,从原始标题控件复制 .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
4

1 回答 1

3

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

内容控制 (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 上的数据绑定工具包(最近未检查该链接)

于 2012-09-03T09:13:13.150 回答