VBA Excelcheckboxselect工作表上的所有特定checkbox

我有一个Excel工作表,其中第一个checkboxCheckBox的两列是“主”checkbox,切换所有其他checkbox。
我从本教程中获得了代码。

它工作正常,直到我复制到第二列的代码。
当激活第一个或第二个“主”checkbox,它激活所有checkbox。
第一个“主”checkbox被称为“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 

首先,您需要将第1列中的checkbox与第2列中的checkbox区分开来。

例如,您可以在第1列MCB1.1追随者checkbox命名为MCB1.1MCB1.2MCB1.3等等。 第2栏中的checkbox也是一样的: MCB2.1MCB2.2MCB2.3

列1和2中的“主”checkbox可以命名为MCB1MCB2

然后你的代码需要修改如下:(没有时间去testing它)

 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 

这种替代方法为我工作

 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