Vba Word表中相互排除的复选框

Vba Word表中相互排除的复选框,vba,checkbox,ms-word,Vba,Checkbox,Ms Word,我创建了一个Word文档(Word 2016),通过单击按钮,可以生成一个具有预定义文本和格式的表格 专栏1 专栏2 第3栏 问题(是/否) 是复选框 无复选框 您的代码不起作用,因为您只是设置变量的值,而不是复选框的选中状态。实现所需结果的最简单方法是将一个复选框的选中状态设置为另一个复选框的相反状态,如下所示: mytable.Cell(8, 2).Range.ContentControls(1).Checked = Not mytable.Cell(8, 3).Range.ContentC

我创建了一个Word文档(Word 2016),通过单击按钮,可以生成一个具有预定义文本和格式的表格

专栏1 专栏2 第3栏 问题(是/否) 是复选框 无复选框
您的代码不起作用,因为您只是设置变量的值,而不是复选框的选中状态。实现所需结果的最简单方法是将一个复选框的选中状态设置为另一个复选框的相反状态,如下所示:

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时,很少需要选择任何内容


最后,您似乎没有强制执行变量声明。这可能导致代码中出现可避免的错误。只需在每个代码模块的顶部添加
选项Explicit
。当您有未声明的变量时,这将阻止代码编译。要将其自动添加到新模块,请打开VBE并转到“工具”选项。在“选项”对话框中,确保选中了“要求变量声明”。

您的代码不起作用,因为您只是设置变量的值,而不是复选框的选中状态。实现所需结果的最简单方法是将一个复选框的选中状态设置为另一个复选框的相反状态,如下所示:

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时,很少需要选择任何内容



最后,您似乎没有强制执行变量声明。这可能导致代码中出现可避免的错误。只需在每个代码模块的顶部添加
选项Explicit
。当您有未声明的变量时,这将阻止代码编译。要将其自动添加到新模块,请打开VBE并转到“工具”选项。在“选项”对话框中,确保选中“需要变量声明”。

如果只使用带有“是”和“否”选项的下拉列表,则会简单得多。不需要代码来确保只能选择一个选项。此外,通过下拉列表,您可以检查是否确实做出了选择,而不是依赖于文档默认状态的推断。如果您对复选框十分着迷,请参阅,例如:&或使用一个复选框,其中选中表示“是”,未选中表示“否”-这是复选框的基本概念。@FunThomas-未选中表示“否”和“未回答”-这是复选框的基本缺陷。@timothyrylat:True,如果您需要区分,您需要一个三态框-不知道这在Word中是否可行。另一方面,我讨厌简单的“是/否”选项的下拉列表,它们对用户非常不友好。@FunThomas-这在Word中不是一个选项。虽然我同意下拉列表不太方便用户使用,但它至少可以清楚地指出哪些问题没有得到回答。如果您只使用带有“是”和“否”选项的下拉列表,会简单得多。不需要代码来确保只能选择一个选项。此外,通过下拉列表,您可以检查是否确实做出了选择,而不是依赖于文档默认状态的推断。如果您对复选框十分着迷,请参阅,例如:&或使用一个复选框,其中选中表示“是”,未选中表示“否”-这是复选框的基本概念。@FunThomas-未选中表示“否”和“未回答”-这是复选框的基本缺陷。@timothyrylat:True,如果您需要区分,您需要一个三态框-不知道这在Word中是否可行。另一方面,我讨厌简单的“是/否”选项的下拉列表,它们对用户非常不友好。@FunThomas-这在Word中不是一个选项。虽然我同意下拉列表不太方便用户,但它至少可以清楚地指出哪些问题没有得到回答。您好,非常感谢您的友好回复和建议。我已尝试将您的代码插入我的支票,但该功能只起作用一次。有没有办法使它永久化?i、 e.用户选择“是”->“否”自动取消选择。之后,用户改变主意并选择“否”->“是”这一次将自动取消选择。我应该提到,所有操作都已开始,因为我无法转换我创建的选项按钮的图标(通过InlineShapes.AddolControl)从内有圆点的圆到方格boxes@hono-我不明白你说的永久化是什么意思。您需要允许用户改变对答案的看法。如果希望代码多次运行,则需要查看如何使用
ContentControlOnExit
事件,不过需要找到一种方法来识别触发事件的控件。通常的方法是使用唯一的标记。我指的是与ActiveX“选项按钮”相同的行为。我最初将选择作为此选项按钮插入,但要求我将该圆形图标更改为复选框图标,因此我尝试了另一种方法(如上所述,不起作用)。@hono-您需要使用
ContentControlOnExit
事件。您好,非常感谢您的友好回复和建议。我已尝试将您的代码插入我的支票,但该功能只起作用一次。有没有办法使它永久化?i、 e.用户选择“是”->“否”自动取消选择。之后,用户改变主意并选择“否”->“是”这一次将自动取消选择。我应该提到,所有操作都已开始,因为我无法转换我创建的选项按钮的图标(通过InlineShapes.AddolControl)从内有圆点的圆到方格boxes@hono-我不明白你说的永久化是什么意思。您需要允许用户改变对答案的看法。如果希望代码多次运行,则需要查看如何使用
ContentControlOnExit
事件,不过需要找到一种方法来识别触发事件的控件。通常的方法是使用唯一的标记。我指的是与ActiveX“选项按钮”相同的行为。我最初插入了s