如何使checkbox在Excel中对相邻的checkbox做出反应

我在Excel(2010)中有两列checkbox(来自“表单控件”),它们将指示是否完成两个任务之一。 第二个任务在第一个任务完成之前是不能完成的,但是可能会出现给定行中的任务都在同一天完成的情况。 为了避免任何额外的点击,我想这样做,如果第二个任务完成(和检查),然后第一个任务成为自动检查。

我该怎么做呢?

例如:

在这里输入图像说明

我希望能够手动检查单元格B5 ,但是如果单元格C5被选中,我希望单元格B5被自动检查。

  • 但是,我不想要:

    • 取消C5来影响B5
    • 检查/取消选中B5以影响C5

我知道我可以“单元格链接”第二个checkbox列到第三列创build一个输出,但我不知道如何使第一列checkbox被动反应… …

  • 不过,理想情况下,如果可能的话,我想放弃更多的列。

最终解决scheme:

我用@ GaryStudent的答案来告诉我最后的一般化解决scheme:

  1. select所需的checkbox的所有列/行
  2. 运行WhatIsNamemacros将每个checkbox的名称更改为它所在的基础单元格:

    • 注意:确保每个给定单元格中的checkbox是全部的,否则它将不能正常工作!

       Sub WhatsInaName() Dim bx As CheckBox For Each bx In ActiveSheet.CheckBoxes bx.Name = bx.BottomRightCell.Address(0, 0) Next bx End Sub 
  3. 接下来,选中右侧checkbox列的最后一行,右键单击,分配macros“CheckBoxSimplifier”

     Sub CheckBoxSimplifier() it. Applies to all rows above it for some reason Dim MySelf As CheckBox, OtherBox As CheckBox Set MySelf = ActiveSheet.CheckBoxes(Application.Caller) Col = Mid(Application.Caller, 1, 1) Col2 = Chr(Asc(Col) - 1) Set OtherBox = ActiveSheet.CheckBoxes(Col2 & Mid(Application.Caller, 2)) If MySelf.Value = 1 Then OtherBox.Value = 1 End Sub 
    • 出于某种原因,代码只适用于将macros应用于最后一行checkbox。

    • 此外,我发现我可以onyl每个文件运行一次 WhatsInaaNamemacros。 如果我第二次尝试运行它(例如,添加更多行之后),则无法正常运行(并且只是复制上次运行的最后一行。

这个小窍门依赖于CheckBoxes的命名

您可以将名称分配给工作表中的所有checkbox。 比方说,我们将它们命名为相关的单元格后,

 Sub NameThem() ActiveSheet.CheckBoxes(1).Name = "C5" ActiveSheet.CheckBoxes(2).Name = "B5" End Sub 

然后,我们为所有的C型checkbox分配一个小处理程序,如:

 Sub MACC5() Dim C5 As CheckBox, B5 As CheckBox Set C5 = ActiveSheet.CheckBoxes("C5") Set B5 = ActiveSheet.CheckBoxes("B5") If C5.Value = 1 Then B5.Value = 1 End Sub 

每个处理程序子程序将被自定义以引用适当的B型框。

您也可以为所有Ctypes创build一个通用处理程序。

EDIT1:

以下是您可以用于所有C的一般常规:

 Sub GeneralHandler() Dim MySelf As CheckBox, OtherBox As CheckBox Set MySelf = ActiveSheet.CheckBoxes(Application.Caller) Set OtherBox = ActiveSheet.CheckBoxes("B" & Mid(Application.Caller, 2)) If MySelf.Value = 1 Then OtherBox.Value = 1 End Sub 

编辑#2:

这个简短的小组将把工作表中的所有checkbox重命名为它们所在的单元格的地址:

 Sub WhatsInaName() Dim bx As CheckBox For Each bx In ActiveSheet.CheckBoxes bx.Name = bx.BottomRightCell.Address(0, 0) Next bx End Sub 

只要确保电池足够大,可以完全封闭盒子。

在这里输入图像描述

选项1:

将两个activeXcheckbox插入需要它们的两列中.B5中的checkbox将为CheckBox1,C5将为CheckBox2,然后双击c5中的CheckBox2并input以下代码:

  If CheckBox2.Value = True Then If CheckBox1.Value = False Then CheckBox1.Value = True End If End If 

选项2:

创build两个表单checkbox控件右键单击C5中的checkbox并分配macros。 确保在编辑器中将此过程添加到sheet1代码中,并将其分配给您的checkbox:

 Sub CheckColumnBCheckBox() Dim cb, cb2 As Shape Set cb = ActiveSheet.Shapes("Check Box 1") Set cb2 = ActiveSheet.Shapes("Check Box 2") If cb2.OLEFormat.Object.Value = 1 Then If cb.OLEFormat.Object.Value <> 1 Then cb.OLEFormat.Object.Value = True End If End If End Sub 

备选案文3:

使用工作表更改事件,而不是checkbox。 让用户在列B5和C5中input“X”或“x”来模拟与checkbox相同的内容:将此代码放在sheet1编辑器中: 在这里输入图像描述

 Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("C5:C500")) Is Nothing Then If Target.Value = "X" Or Target.Value = "x" Then If Target.Offset(0, -1).Value <> "X" Or Target.Offset(0, -1).Value <> "x" Then Target.Offset(0, -1).Value = "X" End If End If End If End Sub