2014-03-13 323 views
1

我有一个Excel工作表,其中两列CheckBoxes,其中每个的第一个CheckBox是“主”复选框,用于切换所有其他CheckBoxes。
我从This Tutorial得到了密码。VBA Excel CheckBox选择工作表上的某些特定复选框

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

首先你需要从第1列differenciate复选框那些列2

例如,你可以在第1列作为MCB1.1名追随者的复选框,MCB1.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 
+0

在你的第二个段落,我觉得你的意思是:'...对于第2栏中的复选框:MCB2.1,MCB2.2,MCB2.3.' – ARich

+0

@ARICH是的,你是对的。谢谢! – hstay

1

这种替代方法为我工作

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