如何使用UserForm CheckBox更改Word文档中的Control Content CheckBox?

时间:2019-08-26 21:29:16

标签: vba checkbox ms-word word-contentcontrol

我在Word文档中创建了一个带有复选框'cbxYes'和内容控制复选框'docCbx' UserForm 。我想取消 UserForm 中的'cbxYes'复选框,然后更改Word文档中的“内容控制”复选框。 因此,输入来自 UserForm 复选框,输出是Content Control复选框。

我已经尝试过多次搜索以了解如何执行此操作,但是我找不到所需的确切信息。大多数搜索与Excel相关。老实说,我不知道我在做什么。请。正确的帮助将不胜感激。

Private Sub cbxYes_Click()

Dim oCC As ContentControl

If cbxYes.value = True Then
   cbxYes.value = "True"
   ActiveDocument.docCbx_Yes.value = True
Else
   cbxYes.value = "False"
   ActiveDocument.docCbx_Yes.value = False
End If

End Sub

我得到的错误是:

  

运行时错误'438':对象不支持此属性或方法。

2 个答案:

答案 0 :(得分:0)

假设“ docCbx”是内容控件的标题,则可以替换

ActiveDocument.docCbx_Yes.value = True

作者

For Each oCC In  ActiveDocument.SelectContentControlsByTitle("docCbx")
  If (oCC.Type = wdContentControlCheckBox) Then 
    oCC.Checked = False
  End If
Next

以及等效的代码,但对其他代码分支使用False。上面的代码将使用该名称更新所有复选框类型内容控件(名称在文档中不必唯一),但标记为“内容无法编辑”的控件除外-它们将维持不变。它通过不执行任何操作来处理没有该名称的内容控件的情况。

如果“ docCbx”是 Tag 的值,则需要以下内容:

For Each oCC In  ActiveDocument.SelectContentControlsByTag("docCbx")
  If (oCC.Type = wdContentControlCheckBox) Then 
    oCC.Checked = False
  End If
Next

如果docCbx还是别的,我建议您改为为内容控件提供标题和/或标签,并使用上述方法。否则,您应该修改问题以准确说明控件的命名方式“ docCbx”。

您会收到此错误,因为将内容控件添加到文档不会创建文档对象的新成员,而将表单控件添加到用户表单却会创建Form对象的新成员。 (事实上​​,文档确实具有一种机制,其工作方式与Form对象类似,但已被弃用了很长时间。)

答案 1 :(得分:0)

问题中显示的代码将用于ActiveX复选框,而不是内容控件。 (只是使事情变得非常复杂,Word还具有复选框 form字段,它们需要另一种代码语法。)

无法通过Document对象直接引用内容控件名称-必须在ContentControls集合上完成。可以在“属性”对话框中为内容控件分配Title和/或Tag

enter image description here

多个内容控件可以具有相同的名称或标题,这使代码有点复杂。查询Document.ContentControls("Title")返回一个集合(带有该标题的所有内容控件)。

如果您知道哪一个,则可以使用Item方法直接指定它(而不是通过一个集合),并指定它为 n 内容控件(按内容控件的顺序进行索引)。通常在只有一个知道的情况下使用。

还请注意,为了“选中”或“取消选中”内容控件复选框,应使用Checked属性。所以:

Private Sub cbxYes_Click()

Dim oCC As ContentControl
Set oCC = ActiveDocument.SelectContentControlsByTitle("docCbx").Item(1)

If cbxYes.value = True Then
   'cbxYes.value = "True" not needed
   occ.Checked = True
Else
   'cbxYes.value = "False" not needed
   oCC.Checked = False
End If

End Sub