如何使复选框对Excel

时间:2017-02-07 17:38:47

标签: excel vba checkbox

我在Excel(2010)中有2列复选框(来自"表单控件"),它们将指示是否完成了两个任务之一。第二个任务在完成第一个任务之前无法完成,但可能存在给定行中的两个任务在同一天完成的情况。为了避免任何额外的点击,我想这样做,如果第二个任务完成(并检查),那么第一个任务将自动检查。

我该怎么做?

例如:

enter image description here

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

  • 但是,我不想要:

    • 取消选中C5以影响B5
    • 选中/取消选中B5以影响C5

我知道我可以"手机链接"第二个复选框列到第3列以创建输出,但我不知道如何使第一列复选框对此反应...

  • 但是,理想情况下,如果可能,我还想放弃其他列。

最终解决方案:

我使用@ GaryStudent的answer来通知我的最终通用解决方案:

  1. 选择所需复选框的所有列/行
  2. 运行WhatIsName宏将每个复选框的名称更改为它所在的基础单元格:

    • 注意:确保每个给定单元格中的复选框都是完整的,否则它无法正常工作!!

      Sub WhatsInaName()
        Dim bx As CheckBox
        For Each bx In ActiveSheet.CheckBoxes
            bx.Name = bx.BottomRightCell.Address(0, 0)
        Next bx
      End Sub
      
  3. 接下来,选择右侧复选框列的最后一行,右键单击,指定宏" 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宏一次。如果我第二次尝试运行它(例如,在添加更多行之后),则无法正常工作(并且只是复制了上次运行时的最后一行。

2 个答案:

答案 0 :(得分:1)

enter image description here

选项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编辑器: enter image description here

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

确保牢房足够大以完全封闭盒子。