根据其他复选框状态更改内容控件复选框的状态
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 Case
是 If
的替代方案 - 更容易阅读......在这种情况下,它可以比较标签名称的公共部分对于一组。 "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
我有一个模板 .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 Case
是 If
的替代方案 - 更容易阅读......在这种情况下,它可以比较标签名称的公共部分对于一组。 "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