【问题标题】:How Content Controls are indexed in repeating Section Content Control?如何在重复部分内容控件中对内容控件进行索引?
【发布时间】:2019-03-24 03:33:45
【问题描述】:

我的文档有两段:第一个是纯文本 CC,第二个是重复部分 CC,里面有一个纯文本 CC。

我正在尝试将 CC 重复部分中的所有信息移动到 CC 的第一段中。到目前为止,我已经来到了这段代码:

 Sub first_paragraph()

    Dim x As Integer
    Dim xNames As String
    Dim xEntry As String

    xNames = ""

    With ActiveDocument.SelectContentControlsByTag("VP_pav")

        For x = 1 To .Count
            With .Item(x)
                If .Tag = "VP_pav" Then
                    xEntry = ActiveDocument.SelectContentControlsByTag("VP_pav").Item(x).Range.Text
                        ' "if" for removing comma before first entry
                         If xNames = "" Then
                            xNames = xEntry + xNames
                            Else
                            xNames = xEntry + ", " + xNames
                            End If
                    End If
                End With
            Next x
        End With

    ActiveDocument.SelectContentControlsByTag("pirm_pas").Item(1).Range.Text = xNames

End Sub

CC 在重复部分 CC(然后添加新部分)中生成的问题似乎获得了随机项目编号(我认为带有标签“示例”的第一个 CC 将获得项目编号 1,具有相同标签的第二个 CC 获得项目编号 2等等,但似乎并非如此)。

因为新生成的CC获取的是随机项号,所以第一段CC中的值是乱序的。

是否可以让新生成的CC获取序号?如果它们不是连续的,他们如何获得项目编号?应该采取一些不同的方法吗?

我正在添加图片来说明我的情况:

附言我正在删除我最近发布的关于在这种情况下正确变量顺序的问题,因为我确定这(可能)不是问题。

【问题讨论】:

    标签: vba ms-word word-contentcontrol


    【解决方案1】:

    通过显示的代码,没有任何内容告诉 Word 以任何顺序读取内容控件。在这种情况下,更好的方法是在 Repeaing Section 内容控件中循环内容控件。

    以下示例假定RepSec 已分配给重复部分内容控件的Title

     Sub first_paragraph()
        Dim xNames As String, xEntry as String
        Dim ccRepSec as Word.ContentControl
        Dim cc as Word.ContentControl
    
        xNames = ""
    
        Set ccRepSec = ActiveDocument.SelectContentControlsByTitle("RepSec").Item(1)    
        For Each cc in ccRepSec.Range.ContentControls
             If .Tag = "VP_pav" Then
                  xEntry = cc.Range.Text
                  If xNames = "" Then
                     xNames = xEntry & xNames
                  Else
                     xNames = xEntry & ", " & xNames
                  End If
             End If
        Next cc
    
        ActiveDocument.SelectContentControlsByTag("pirm_pas").Item(1).Range.Text = xNames    
    End Sub
    

    【讨论】:

    • 感谢您的建议,我想我已经接近了,但是使用您提供的代码,我收到编译错误:.Tag 部分的引用无效或不合格。我已将其编辑为 If ActiveDocument.SelectContentControlsByTag("VP_pav").Item(1).Tag = "VP_pav" Then ,但现在我遇到了不同的问题。在我的示例中,每个重复部分 CC 只有一个 CC,在实际文档中有 11 个,现在它们都显示在第一段 CC 框中,但我只需要移动重复部分 CC 值中的第一个 CC。如何在重复部分 CC 中的第一个 CC 之后停止代码?
    • 我在link 中也发现了看似相似的问题,但我无法理解 VBA 中的 Word 对象管理。所以我无法在给定的链接示例代码中掌握数组的使用:Set docCCs = ActiveDocument.SelectContentControlsByTage("summary") x = docCCs. Count For Each cc in docCCs i = i + 1 Set myRange = cc.Range arrData(i,2) = myRange.Text arrData(i,3) = myRange.Start Next我可以在我的情况下以某种方式使用它吗?
    • 致您的第一条评论:您展示的If 完全没有意义。如果您按标签选择内容控件,则无需进一步测试Tag 属性。此外,分配给内容控制对象。在我的测试中,重复内容控件有多个嵌套的内容控件。您的示例特别要求循环所有嵌套的内容控件,所以我不明白您的“新”问题。但是基于 my 示例代码来获取第一个:ccRepSec.Range.ContentControls(1) 将返回第一个。
    • 我对 MS-Word 对象管理完全感到困惑。我正在尝试运行您提供的完全相同的代码,但得到“编译错误:无效或不合格的参考”,Sub first_paragraph() 标记为黄色,.Tag 标记为蓝色。至于循环,也许我有点不清楚,我需要遍历所有重复的部分 CC,其中会有几个嵌套的 CC。从每个重复部分 CC 我需要找到特定的嵌套 CC 并取其值。
    • 我终于找到了问题 If .Tag = "VP_pav" Then 行应该是 If cc.Tag = "VP_pav" Then 。我花了太长时间盯着代码并试图思考另一种解决方案,而整个代码只需要两个字母......现在一切正常。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多