如何使checkbox在Excel中对相邻的checkbox做出反应
我在Excel(2010)中有两列checkbox(来自“表单控件”),它们将指示是否完成两个任务之一。 第二个任务在第一个任务完成之前是不能完成的,但是可能会出现给定行中的任务都在同一天完成的情况。 为了避免任何额外的点击,我想这样做,如果第二个任务完成(和检查),然后第一个任务成为自动检查。
我该怎么做呢?
例如:
我希望能够手动检查单元格B5
,但是如果单元格C5
被选中,我希望单元格B5
被自动检查。
-
但是,我不想要:
- 取消
C5
来影响B5
- 检查/取消选中
B5
以影响C5
- 取消
我知道我可以“单元格链接”第二个checkbox列到第三列创build一个输出,但我不知道如何使第一列checkbox被动反应… …
- 不过,理想情况下,如果可能的话,我想放弃更多的列。
最终解决scheme:
我用@ GaryStudent的答案来告诉我最后的一般化解决scheme:
- select所需的checkbox的所有列/行
-
运行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
-
-
接下来,选中右侧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