在 Word 中相互排除复选框 table
Mutually excluding checkboxes in Word table
我创建了一个 Word 文档 (Word 2016),通过单击一个按钮,它会生成一个 Table 具有预定义文本和格式的文档。
Column1
Column2
Column3
QUESTION (Y/N)
YES_Checkbox
No_Checkbox
第 8 行(如上所示)包含一个 YES/NO 问题;为了解决这个问题,我使用以下语法插入了两个复选框(一个在 Column2 中,另一个在 Column3 中):
For ii = 2 To 3
Set rng = mytable.Cell(8, ii).Range
rng.Select
With Selection
.Collapse Direction:=wdCollapseStart
.Range.ContentControls.Add wdContentControlCheckBox
.MoveRight Unit:=wdCharacter, Count:=2
End With
Next ii
我的想法是拥有相互排斥的复选框:这意味着,如果用户select选择“是”,则“否”会自动取消select(反之亦然)。为此,我在主按钮脚本中创建了一个 Sub。它检查复选框值,然后尝试使用以下代码(尚未完成)'tick it'(取消勾选):
Sub Check_YES_Not(tblNew)
Dim thisCell As Range
check1 = mytable.Cell(8, 2).Range.ContentControls(1).Checked
check2 = mytable.Cell(8, 3).Range.ContentControls(1).Checked
'If condition to be added
check1 = True 'This is how I am trying to modify the checkbox, but it is not working
'ElseIf add other conditions...
'Msgbox "to be completed..."
'End If
End Sub
代码运行并正确创建 table,但复选框脚本未按我希望的方式运行。有人可以告诉我我做错了什么以及如何让它发挥作用吗?非常感谢。
更新
我就是这样解决的。还有一些小问题(例如,如果我单击“是”,我需要在单击“否”之前 select 另一个单元格,否则控件将无法正常工作)。除此之外,非常感谢@macropod 和 Timothy 的大力支持。
为了允许用户创建额外的 table,我创建了一个 Public
计数器,每次添加 table 时计数器都会增加。这不是一个优雅的解决方案,但现在可以使用。最初的 table 有一个不同的标签(我没有在这里包含它)。
Private Sub Document_ContentControlOnExit(ByVal oCC As ContentControl, Cancel As Boolean)
Dim collCCs As ContentControls
Dim oCCTarget As ContentControl
Dim ii As Integer
For ii = 1 To 500 'Additional tables
If Not IsEmpty(ActiveDocument.SelectContentControlsByTag("NO" + Str(ii))) Then
Select Case oCC.Tag
Case "YES" + Str(ii)
Set collCCs = ActiveDocument.SelectContentControlsByTag("NO" + Str(ii))
For Each oCCTarget In collCCs
If oCCTarget.Checked = True Then
oCCTarget.Checked = False
Exit For
End If
Next
Case "NO" + Str(ii)
Set collCCs = ActiveDocument.SelectContentControlsByTag("YES" + Str(ii))
For Each oCCTarget In collCCs
If oCCTarget.Checked = True Then
oCCTarget.Checked = False
Exit For
End If
Next
End Select
End If
Next ii
您的代码不起作用,因为您只是设置变量的值,而不是复选框的选中状态。实现您想要的结果的最简单方法是将一个复选框的选中状态设置为另一个复选框的相反状态,如下所示:
mytable.Cell(8, 2).Range.ContentControls(1).Checked = Not mytable.Cell(8, 3).Range.ContentControls(1).Checked
您插入内容控件的代码也可以简化为:
For ii = 2 To 3
mytable.Cell(8, ii).Range.ContentControls.Add wdContentControlCheckBox
Next ii
在使用 Word 时很少需要 select 任何东西。
最后,您似乎没有强制声明变量。这可能会导致代码中出现可避免的错误。只需在每个代码模块的顶部添加 Option Explicit
即可。当您有未声明的变量时,这将阻止您的代码编译。要将其自动添加到新模块,请打开 VBE 并转到工具 |选项。在“选项”对话框中,确保选中“要求变量声明”。
我创建了一个 Word 文档 (Word 2016),通过单击一个按钮,它会生成一个 Table 具有预定义文本和格式的文档。
Column1 | Column2 | Column3 |
---|---|---|
QUESTION (Y/N) | YES_Checkbox | No_Checkbox |
第 8 行(如上所示)包含一个 YES/NO 问题;为了解决这个问题,我使用以下语法插入了两个复选框(一个在 Column2 中,另一个在 Column3 中):
For ii = 2 To 3
Set rng = mytable.Cell(8, ii).Range
rng.Select
With Selection
.Collapse Direction:=wdCollapseStart
.Range.ContentControls.Add wdContentControlCheckBox
.MoveRight Unit:=wdCharacter, Count:=2
End With
Next ii
我的想法是拥有相互排斥的复选框:这意味着,如果用户select选择“是”,则“否”会自动取消select(反之亦然)。为此,我在主按钮脚本中创建了一个 Sub。它检查复选框值,然后尝试使用以下代码(尚未完成)'tick it'(取消勾选):
Sub Check_YES_Not(tblNew)
Dim thisCell As Range
check1 = mytable.Cell(8, 2).Range.ContentControls(1).Checked
check2 = mytable.Cell(8, 3).Range.ContentControls(1).Checked
'If condition to be added
check1 = True 'This is how I am trying to modify the checkbox, but it is not working
'ElseIf add other conditions...
'Msgbox "to be completed..."
'End If
End Sub
代码运行并正确创建 table,但复选框脚本未按我希望的方式运行。有人可以告诉我我做错了什么以及如何让它发挥作用吗?非常感谢。
更新
我就是这样解决的。还有一些小问题(例如,如果我单击“是”,我需要在单击“否”之前 select 另一个单元格,否则控件将无法正常工作)。除此之外,非常感谢@macropod 和 Timothy 的大力支持。
为了允许用户创建额外的 table,我创建了一个 Public
计数器,每次添加 table 时计数器都会增加。这不是一个优雅的解决方案,但现在可以使用。最初的 table 有一个不同的标签(我没有在这里包含它)。
Private Sub Document_ContentControlOnExit(ByVal oCC As ContentControl, Cancel As Boolean)
Dim collCCs As ContentControls
Dim oCCTarget As ContentControl
Dim ii As Integer
For ii = 1 To 500 'Additional tables
If Not IsEmpty(ActiveDocument.SelectContentControlsByTag("NO" + Str(ii))) Then
Select Case oCC.Tag
Case "YES" + Str(ii)
Set collCCs = ActiveDocument.SelectContentControlsByTag("NO" + Str(ii))
For Each oCCTarget In collCCs
If oCCTarget.Checked = True Then
oCCTarget.Checked = False
Exit For
End If
Next
Case "NO" + Str(ii)
Set collCCs = ActiveDocument.SelectContentControlsByTag("YES" + Str(ii))
For Each oCCTarget In collCCs
If oCCTarget.Checked = True Then
oCCTarget.Checked = False
Exit For
End If
Next
End Select
End If
Next ii
您的代码不起作用,因为您只是设置变量的值,而不是复选框的选中状态。实现您想要的结果的最简单方法是将一个复选框的选中状态设置为另一个复选框的相反状态,如下所示:
mytable.Cell(8, 2).Range.ContentControls(1).Checked = Not mytable.Cell(8, 3).Range.ContentControls(1).Checked
您插入内容控件的代码也可以简化为:
For ii = 2 To 3
mytable.Cell(8, ii).Range.ContentControls.Add wdContentControlCheckBox
Next ii
在使用 Word 时很少需要 select 任何东西。
最后,您似乎没有强制声明变量。这可能会导致代码中出现可避免的错误。只需在每个代码模块的顶部添加 Option Explicit
即可。当您有未声明的变量时,这将阻止您的代码编译。要将其自动添加到新模块,请打开 VBE 并转到工具 |选项。在“选项”对话框中,确保选中“要求变量声明”。