根据其他复选框状态更改内容控件复选框的状态

Change state of content control checkbox based on other checkboxes state

我有一个模板 .dotm,其中有多个复选框内容控件。它们按如下方式组织:

[chk_1] Attach all the items listed below:

      [chk_1_1] Item A
      [chk_1_2] Item B
      [chk_1_3] Item C

[chk_2] Send the details provided below:

      [chk_2_1] Info A
      [chk_2_2] Info B
      [chk_2_3] Info C

我正在尝试做的是一种方法,如果任何子项被选中,则自动检查 chk_1,作为某种防故障系统,如果用户忘记手动检查 chk_1。 到目前为止,我已经设法手动执行此操作,如下所示:

Private Sub btnSubmit_Click()
Dim ctl As ContentControl
For Each ctl In ActiveDocument.ContentControls
If ctl.Type = wdContentControlCheckBox Then
    If ctl.Tag = "chk_1_1" or ctl.Tag = "chk_1_2" or ctl.Tag = "chk_1_3" Then
        If ctl.Checked = True Then
            ActiveDocument.SelectContentControlsByTag("chk_1").Item(1).Checked = True
        End If
    End If
End If         
Next
Dim ctl2 As ContentControl
For Each ctl2 In ActiveDocument.ContentControls
If ctl2.Type = wdContentControlCheckBox Then
    If ctl2.Tag = "chk_2_1" or ctl2.Tag = "chk_2_2" or ctl2.Tag = "chk_2_3" Then
        If ctl2.Checked = True Then
            ActiveDocument.SelectContentControlsByTag("chk_2").Item(1).Checked = True
        End If
    End If
End If         
Next
End Sub

单击 ActiveX 按钮 btnSubmit 并自动选中父复选框(如果选中任何子复选框)时执行此代码。

我想简化代码,因为随着时间的推移,会有多个组,每个组都有 20 多个复选框,代码会更难编写。

有没有办法使用字符串或检查所有标记为 chk_x_y 的复选框的状态,然后修改状态 chk_x

像这样的东西可能更容易阅读和维护。

如果控件命名一致,则无需检查控件是否为复选框 - 名称将识别它。

当使用多个 "or" 条件时,

Select CaseIf 的替代方案 - 更容易阅读......在这种情况下,它可以比较标签名称的公共部分对于一组。 "Greater than" 将在 upper-level 控件下选择只有公共字符的较长标签名称。

请注意,在使用此方法时,您需要按字母表逆向操作。

然后,每次执行的实际操作都放在一个单独的过程中,由每个 "Case".

调用

因此,在为多个控件编写代码时,您几乎可以 copy/paste Case 然后更改每个控件集的两个标记字符串。

Sub GetCC_Set()
    Dim cc As Word.ContentControl
    Dim doc As Word.Document

    Set doc = ActiveDocument
    For Each cc In doc.Contentcontrols
        Select Case cc.tag
            Case Is > "ck2"
                Debug.Print 2
                CheckItems "ck2", cc
            Case Is > "ck1"
                Debug.Print 1
                CheckItems "ck1", cc
            Case Else
                Debug.Print cc.tag
        End Select
    Next                
End Sub

Sub CheckItems(tag As String, cc As Word.ContentControl)
    If cc.Checked = True Then
        cc.Parent.SelectContentControlsByTag(tag).Item(1).Checked = True
    End If
End Sub