Word VBA SelectContentControlsByTag 集合乱序?

问题描述 投票:0回答:2

我正在开发一个 Word 模板表单,使用下拉列表的 ContentControl 字段。我制作了一个宏来获取每个标记为“必需”的内容控件,并检查它是否显示占位符文本。如果是,它会弹出一个消息框,要求用户填写必填字段,并且理想情况下会跳转到该内容控制框的书签。

经过大量迭代和故障排除后,它实际上可以做到这一点,但我注意到必填字段的集合是......随机顺序的。我通过在 Word 文档底部添加另一个名为“jimmy”的内容控件下拉列表来测试这一点,然后查看集合,发现它位于所有其他必填字段的中间。

有谁知道“SelectContentControlsByTag”方法如何决定其顺序,以及是否有一种可靠的方法使其使用它们在文档中放置的顺序?我有相当多的编码经验,但就 VBA 而言,我完全是自学的,所以我很感激您的帮助!

这是我当前的代码(Doc在Document_New中设置,书签跳转当前不在,我只是检查VBA/消息框中的顺序)

Set reqFields = Doc.SelectContentControlsByTag("required")
For Each iField In reqFields
    If iField.ShowingPlaceholderText Then
        Dim Msg, Style, Title, Response
        Msg = "The dropdowns marked with * cannot be left blank. Do you want to select a response before exiting? Box: " & iField.Title    ' Define message.
        Style = vbYesNo + vbCritical + vbDefaultButton1    ' Define buttons.
        Title = "Warning: Empty fields"    ' Define title.
            ' Display message.
        Response = MsgBox(Msg, Style, Title)
        If Response = vbYes Then
            Doc.Saved = False: SendKeys "{ESC}"
            'iField.Range.Select
            Exit Sub
        End If
        'Exit For
    End If
'Exit Sub
Next iField
vba ms-word
2个回答
1
投票

抱歉迟了10个月才回复!
当您使用 .selectcontentcontrolsbytag 时,VBA 将按 .ID 循环遍历现有内容控件以提取标签名称。 因此,如果您希望对 (“tag”).item(1) 进行排序,您首先需要按 .ID 编号升序排列内容控件。


0
投票

要修改现有代码以循环所有内容控件并匹配标签,您可以使用与第二个代码段中提供的结构类似的结构。这是更新后的代码:

Dim reqFields As Collection
Set reqFields = New Collection

' Loop through all content controls and collect those with the "required" tag
For Each cc In Doc.ContentControls
    If cc.Tag = "required" Then
        reqFields.Add cc
    End If
Next cc

' 循环遍历收集的必填字段

For Each iField In reqFields
    If iField.ShowingPlaceholderText Then
        Dim Msg, Style, Title, Response
        Msg = "The dropdowns marked with * cannot be left blank. Do you want to select a response before exiting? Box: " & iField.Title    ' Define message.
        Style = vbYesNo + vbCritical + vbDefaultButton1    ' Define buttons.
        Title = "Warning: Empty fields"    ' Define title.
        ' Display message.
        Response = MsgBox(Msg, Style, Title)
        If Response = vbYes Then
            Doc.Saved = False
            SendKeys "{ESC}"
            'iField.Range.Select
            Exit Sub
        End If
        'Exit For
    End If
Next iField
© www.soinside.com 2019 - 2024. All rights reserved.