【问题标题】:VBA Excel CheckBox to select all of some specific Checkboxes on SheetVBA Excel CheckBox 选择工作表上的所有特定复选框
【发布时间】:2026-01-27 12:50:01
【问题描述】:

我有一个 Excel 表,其中包含两列 CheckBox,其中每列的第一个 CheckBox 是切换所有其他 CheckBox 的“主”复选框。
我从This Tutorial得到了代码。

在我将代码复制到第二列之前它运行良好。
当激活第一个或第二个“主”复选框时,它会激活所有复选框。
第一个“主”复选框称为“MCB1”,第二个在此代码的副本中(带有另一个子名称)并称为 MCB2。

这是我的代码:

Sub SelectAll_Read()
Dim CB As CheckBox
 For Each CB In ActiveSheet.CheckBoxes
  If CB.Name <> ActiveSheet.CheckBoxes("MCB1").Name Then
   CB.Value = ActiveSheet.CheckBoxes("MCB1").Value
  End If
 Next CB
End Sub

Sub Mixed_ReadState()
Dim CB As CheckBox
For Each CB In ActiveSheet.CheckBoxes
  If CB.Name <> ActiveSheet.CheckBoxes("MCB1").Name And CB.Value <> ActiveSheet.CheckBoxes("MCB1").Value And ActiveSheet.CheckBoxes("MCB1").Value <> 2 Then
    ActiveSheet.CheckBoxes("MCB1").Value = 2
Exit For
   Else
     ActiveSheet.CheckBoxes("MCB1").Value = CB.Value
  End If
Next CB
End Sub

【问题讨论】:

    标签: vba excel checkbox


    【解决方案1】:

    首先,您需要区分第 1 列和第 2 列中的复选框。

    例如,您可以将第 1 列中的关注者复选框命名为 MCB1.1MCB1.2MCB1.3 等。第 2 列中的复选框也是如此:MCB2.1MCB2.2MCB2.3...

    第 1 列和第 2 列中的“主”复选框可以命名为 MCB1MCB2

    那你的代码需要修改如下:(没来得及测试)

    Sub SelectAll_Read()
    Dim CB As CheckBox
        For Each CB In ActiveSheet.CheckBoxes
            If CB.Name <> ActiveSheet.CheckBoxes("MCB1").Name And CB.Name <> ActiveSheet.CheckBoxes("MCB2").Name Then
                If Mid(CB.Name, 4, 1) = "1"
                    CB.Value = ActiveSheet.CheckBoxes("MCB1").Value
                ElseIf Mid(CB.Name, 4, 1) = "2"
                    CB.Value = ActiveSheet.CheckBoxes("MCB2").Value
                End If
            End If
        Next CB
    End Sub
    
    Sub Mixed_ReadState()
    Dim CB As CheckBox
    Dim i As String
    
        For Each CB In ActiveSheet.CheckBoxes
            i = Mid(CB.Name, 4, 1)
            If CB.Name <> ActiveSheet.CheckBoxes("MCB" & i).Name And CB.Value <> ActiveSheet.CheckBoxes("MCB" & i).Value And  ActiveSheet.CheckBoxes("MCB" & i).Value <> 2 Then
                ActiveSheet.CheckBoxes("MCB" & i).Value = 2
                Exit For
            Else
                ActiveSheet.CheckBoxes("MCB" & i).Value = CB.Value
            End If
        Next CB
    End Sub
    

    【讨论】:

    • 在您的第二段中,我认为您的意思是:...for checkboxes in column 2: MCB2.1, MCB2.2, MCB2.3.
    【解决方案2】:

    这种替代方法对我有用

    Sub SelectAll_CHECK_BOX()
        Dim CB As CheckBox
        Dim CB1 As Range
            Set CB1 = ActiveSheet.Range("A1:A30")
        For Each CB In ActiveSheet.CheckBoxes
                If Not Intersect(CB.TopLeftCell, CB1) Is Nothing Then
                    CB.Value = ActiveSheet.CheckBoxes("MCB1").Value
              End If
        Next CB
        Dim CB2 As Range
            Set CB2 = ActiveSheet.Range("B1:B30")
        For Each CB In ActiveSheet.CheckBoxes
                If Not Intersect(CB.TopLeftCell, CB2) Is Nothing Then
                    CB.Value = ActiveSheet.CheckBoxes("MCB2").Value
                End If
        Next CB
    End Sub
    
    Sub Mixed_ReadState()
    Dim CB As CheckBox
        For Each CB In ActiveSheet.CheckBoxes
            If CB.Name <> ActiveSheet.CheckBoxes("MCB1").Name And CB.Value <> ActiveSheet.CheckBoxes("MCB1").Value And ActiveSheet.CheckBoxes("MCB1").Value <> 2 Then
            ActiveSheet.CheckBoxes("MCB1").Value = 2
            Exit For
            Else
            ActiveSheet.CheckBoxes("MCB1").Value = CB.Value
            End If
        Next CB
    End Sub` 
    
    
    
    Sub Mixed_ReadState()
    Dim CB As CheckBox
        For Each CB In ActiveSheet.CheckBoxes
            If CB.Name <> ActiveSheet.CheckBoxes("MCB2").Name And CB.Value <> ActiveSheet.CheckBoxes("MCB2").Value And ActiveSheet.CheckBoxes("MCB2").Value <> 2 Then
            ActiveSheet.CheckBoxes("MCB2").Value = 2
            Exit For
            Else
            ActiveSheet.CheckBoxes("MCB2").Value = CB.Value
            End If
        Next CB
    End Sub
    

    【讨论】:

      最近更新 更多