首页 > 解决方案 > 使用用户表单复选框控制内容控制复选框

问题描述

我有一个带有 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

或类似的东西?

标签: vbacheckboxms-word

解决方案


我已经弄清楚了,对于那些感兴趣的人:

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

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


推荐阅读