我在Excel(2010)中有2列复选框(来自"表单控件"),它们将指示是否完成了两个任务之一。第二个任务在完成第一个任务之前无法完成,但可能存在给定行中的两个任务在同一天完成的情况。为了避免任何额外的点击,我想这样做,如果第二个任务完成(并检查),那么第一个任务将自动检查。
我该怎么做?
例如:
我希望能够手动检查单元格B5
,但如果选中单元格C5
,我希望自动检查单元格B5
。
但是,我不想要:
C5
以影响B5
B5
以影响C5
我知道我可以"手机链接"第二个复选框列到第3列以创建输出,但我不知道如何使第一列复选框对此反应...
最终解决方案:
我使用@ GaryStudent的answer来通知我的最终通用解决方案:
运行WhatIsName宏将每个复选框的名称更改为它所在的基础单元格:
注意:确保每个给定单元格中的复选框都是完整的,否则它无法正常工作!!
Sub WhatsInaName()
Dim bx As CheckBox
For Each bx In ActiveSheet.CheckBoxes
bx.Name = bx.BottomRightCell.Address(0, 0)
Next bx
End Sub
接下来,选择右侧复选框列的最后一行,右键单击,指定宏" 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
出于某种原因,只有将宏应用于 final 行的复选框时,代码才有效。
此外,我发现我可以在每个文件中运行WhatsInaaName宏一次。如果我第二次尝试运行它(例如,在添加更多行之后),则无法正常工作(并且只是复制了上次运行时的最后一行。
答案 0 :(得分:1)
选项1:
将两个activeX复选框插入到您需要它们的两列中.B5中的复选框为CheckBox1,C5为CheckBox2,然后双击c5中的CheckBox2并输入以下代码:
If CheckBox2.Value = True Then
If CheckBox1.Value = False Then
CheckBox1.Value = True
End If
End If
选项2:
创建两个表单复选框控件右键单击C5中的复选框并指定宏。确保将此过程添加到编辑器的sheet1代码中,并将其分配给您的复选框:
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:
使用工作表更改事件而不是复选框。让用户在B5和C5列中输入“X”或“x”以模仿复选框:将此代码放入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
答案 1 :(得分:1)
这个小技巧依赖于CheckBoxes的命名。
您可以将名称分配给工作表中的所有复选框。假设我们在关联的单元格之后命名它们:
Sub NameThem()
ActiveSheet.CheckBoxes(1).Name = "C5"
ActiveSheet.CheckBoxes(2).Name = "B5"
End Sub
然后我们为所有 C-type 复选框分配一个小处理程序,如:
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
每个处理程序sub都将被自定义以引用正确的 B-type 框。
您还可以为所有 C-types 。
制作通用处理程序<强> 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:强>
这个短子将表单中的所有复选框重命名为其封闭单元格的地址:
Sub WhatsInaName()
Dim bx As CheckBox
For Each bx In ActiveSheet.CheckBoxes
bx.Name = bx.BottomRightCell.Address(0, 0)
Next bx
End Sub
确保牢房足够大以完全封闭盒子。