vba - 使用用户表单复选框控制内容控制复选框
问题描述
我有一个带有 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
或类似的东西?
解决方案
我已经弄清楚了,对于那些感兴趣的人:
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
这现在可以完成我需要它做的事情,并且我可以按计划对其进行扩展。希望它对某人有用。
推荐阅读
- javascript - @input 在相同组件角度问题的不同实例中
- kubernetes - 使用 terraform 动态连接到 GKE 集群
- javascript - firebase 创建用户承诺
- python - 使用Biopython从python中的.fasta基因中提取基因起始位置
- javascript - 无法找到按钮以查找其禁用状态以进行测试
- python - 文本未知原因的 Tkinter 消息换行
- ios - 在 SWIFT 5 中点击时无法更改 UIImage systemName 图像
- sql-server - VBA使用'编写SQL字符串而没有被注释掉?
- javascript - 在拦截器中手动设置 auth 'Cookie' 是否安全?
- arrays - 在二维数组中查找整数行