【问题标题】:Controlling Content Control Checkboxes Using Userform Checkboxes使用用户表单复选框控制内容控制复选框
【发布时间】:2019-09-23 22:41:49
【问题描述】:

我有一个带有 5 个复选框内容控件的 Word 文档 - 这些控件用于显示在文档被 pdf 和/或打印时选择(或未选择)哪些选项。他们自己实际上不需要“做”任何事情,代码方面。

我有一个用户表单,它有 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 ...”行出现类型不匹配错误。

我想要做的是用变量名引用我的用户表单复选框,以便我可以循环遍历它们,可能类似于以下内容?

    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

或者类似的?

【问题讨论】:

    标签: vba checkbox ms-word


    【解决方案1】:

    由于文档中的复选框和用户窗体上的复选框具有相应的名称,因此无需使用数组。只需遍历用户窗体上的控件并使用控件名称来寻址内容控件。

    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
    

    【讨论】:

      【解决方案2】:

      我已经弄清楚了,有兴趣的人:

      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
      

      这现在可以完成我需要它做的事情,并且我可以按计划对其进行扩展。希望它对某人有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 2012-11-18
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多