Управление флажками управления контентом с помощью пользовательских флажков - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть текстовый документ с 5 флажками управления содержимым - они используются, чтобы показать, какие параметры были выбраны (или нет), когда документ распечатан и / или напечатан.Самим им на самом деле ничего не нужно «делать», код мудрый.

У меня есть пользовательская форма, которая имеет 5 флажков, которые соответствуют 5 флажкам в документе.Пользователь может выбрать любой, ни один, или все эти флажки пользовательской формы, и я хочу, чтобы флажки управления содержимым документа Word совпадали.

Ради простоты я назвал флажки управления содержимым такими же, как флажки пользовательской формы, в надежде перебрать код, как только он заработает.

При открытии работает следующеепользовательская форма:

Private Sub UserForm_Initialize()

    Dim x As Variant
    Dim z As control

On Error GoTo quit

    For Each x In Array("ChkA", "ChkB", "ChkC", "ChkD", "ChkE")
        For Each z In Me.Controls
            If z.Name = x And ActiveDocument.SelectContentControlsByTitle(x).Item(1).Checked = True Then z.Value = True
        Next z
    Next x

quit:

End Sub

Технически это работает, но немного неуместно, поскольку существует только один экземпляр "ChkA" или "ChkB" и т. д., но этот код проходит по каждому имени для каждогофлажок, означающий, что он выполняет 25 проверок, когда на самом деле это нужно только сделать 5.

Однако, при попытке переместить значения флажка из пользовательской формы обратно в документ Word, «тот же» код выше (но в обратном порядке) не работает, то есть:

Private Sub cmdEnter_Click()

    Dim x As Variant
    Dim z As control

    For Each x In Array("ChkA", "ChkB", "ChkC", "ChkD", "ChkE")
        For Each z In Me.Controls
            If z.Name = x And z.Value = True Then ActiveDocument.SelectContentControlsByTitle(x).Item(1).Checked = True
        Next z
    Next x

    Unload Me

End Sub

Это приводит к ошибке несоответствия типов в строке "For Each z ...".

То, что я хочу сделать, этообратитесь к моим флажкам userform с именем переменной, чтобы я мог их циклически проходить, что-то вроде следующего, может быть?

    Dim x as Variant
    Dim y as String
    Dim z as control

    x = Array("ChkA", "ChkB", "ChkC", "ChkD", "ChkE")

    For i = 0 To 4
        y = x(i)
        Set z = Me.Controls(y)
        ActiveDocument.FormFields(y).CheckBox.Value = z.Value
        Set z = Nothing
    Next i

или что-то подобное?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Поскольку флажки в документе и в пользовательской форме имеют соответствующие имена, нет необходимости использовать массив.Просто прокрутите элементы управления в пользовательской форме и используйте имена элементов управления для обращения к элементам управления содержимым.

Option Explicit

Dim ctl As MSForms.Control

Private Sub UserForm_Initialize()

  For Each ctl In Me.Controls
    If Left(ctl.Name, 3) = "Chk" Then
      ctl.Value = ActiveDocument.SelectContentControlsByTitle(ctl.Name).Item(1).Checked
    End If
  Next ctl

End Sub

Private Sub cmdEnter_Click()

  For Each ctl In Me.Controls
    If Left(ctl.Name, 3) = "Chk" Then
      ActiveDocument.SelectContentControlsByTitle(ctl.Name).Item(1).Checked = ctl.Value
    End If
  Next ctl

  Unload Me

End Sub
0 голосов
/ 23 сентября 2019

Я понял это для интересующихся:

Option Explicit

Dim i As Integer
Dim x As Variant
Dim z As control

Private Sub UserForm_Initialize()

    On Error Resume Next

    x = Array("ChkA", "ChkB", "ChkC", "ChkD", "ChkE") 'names of both userform and content control checkboxes

    For i = 0 To 4
        Set z = Me.Controls(x(i))
        If ActiveDocument.SelectContentControlsByTitle(x(i)).Item(1).Checked = True Then z.Value = True
    Next i

    Set z = Nothing

End Sub

Private Sub cmdEnter_Click()

    On Error Resume Next

    x = Array("ChkA", "ChkB", "ChkC", "ChkD", "ChkE") 'names of both userform and content control checkboxes

    For i = 0 To 4
        Set z = Me.Controls(x(i))
        If z.Value = True Then
            ActiveDocument.SelectContentControlsByTitle(x(i)).Item(1).Checked = True
        Else
            ActiveDocument.SelectContentControlsByTitle(x(i)).Item(1).Checked = False
        End If
    Next i

    Set z = Nothing

    Unload Me

End Sub

Это теперь делает то, что мне нужно, и я могу расширить его, как и планировалось.Надеюсь, это кому-нибудь пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...