Изменить состояние флажка управления содержимым на основе состояния других флажков - PullRequest
0 голосов
/ 08 мая 2019

У меня есть шаблон .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?

1 Ответ

0 голосов
/ 09 мая 2019

Примерно так легче читать и поддерживать.

Если имя элемента управления соответствует, не нужно проверять, является ли элемент управления флажком - имя будет идентифицировать это.

Select Case является альтернативой If при использовании нескольких критериев "или" - несколько проще для чтения ... И в этом случае он может сравнивать общий раздел имен тегов для группы. «Больше чем» подберет более длинные имена тегов под верхним уровнем управления, который имеет только общие символы.

Обратите внимание, что вам нужно работать в обратном направлении по алфавиту при использовании этого подхода.

Затем фактические действия, выполняемые каждый раз, помещаются в отдельную процедуру, вызываемую каждым «делом».

Итак, при написании кода для нескольких элементов управления вы можете в значительной степени скопировать / вставить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...