使用主复选框选中特定复选框

时间:2016-04-28 16:10:19

标签: excel excel-vba vba

我正在尝试创建一个宏来选择某列的所有复选框。 例如,我每列有10个标准复选框,每个列的主复选框为“全选”。 我有代码下来选择每个复选框,但无法弄清楚如何稍微调整它只选择或取消选择单元格A2:A10例如,而不是列B,C等中的框。

我正在使用这个简单的脚本;

Sub SelectAll_Click()
Dim CB As Checkbox
For Each CB In ActiveSheet.CheckBoxes
If CB.Name <> ActiveSheet.CheckBoxes("Check Box 1").Name Then
CB.Value = ActiveSheet.CheckBoxes("Check Box 1").Value
End If
Next CB
End Sub

我尝试更改复选框名称的&lt;,&gt;,=失败,以确定比B列的第一个复选框更少的内容 以及添加= range()

我对这一切都是全新的,我肯定有时间和学习我会回顾并嘲笑我的路障,但如果有人能暂时借给我他们的专业知识,那就是非常感谢。

由于

3 个答案:

答案 0 :(得分:0)

如果您在工作表中引用复选框作为Shape对象,则可以访问属性.TopLeftCell,它将告诉您复选框所在的列。以下代码适用于A列中的所有表单控件复选框。将列#(此代码中的1)更改为您希望的列,并在每种情况下更改主复选框的名称。

Sub SelectAllColumnA_Click()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
    If shp.Type = msoFormControl Then 'Form control
        If shp.FormControlType = xlCheckBox Then
            If shp.Name = "Check Box 1" Then
                'Do not alter value of master check box "Check Box 1"
            ElseIf shp.TopLeftCell.Column = 1 Then
                shp.ControlFormat.Value = ActiveSheet.CheckBoxes("Check Box 1").Value
            End If
        End If
    End If
Next shp
End Sub

编辑:我简化了代码,因为您说您正在使用表单控件。

Edit2:这是一个简单的添加,它将改变主复选框的状态。

Sub SelectSubCheckBoxA()
ActiveSheet.CheckBoxes("Check Box 1").Value = 2
End Sub

只需将此宏指定给A列中的每个复选框。对于其他列,请创建此宏的新版本并更改主复选框的名称。这样,当您单独选中任何复选框时,它将在视觉上“禁用”主复选框。

答案 1 :(得分:0)

在我看来,您希望根据它们所在的列来检查/取消选中您的框。因此,我建议使用以下代码:

Public Sub CheckComboBoxBasedOnColumn()

Dim chk As CheckBox

For Each chk In Sheet2.CheckBoxes
    Select Case Split(chk.TopLeftCell.Address, "$")(1)
    Case "A"
        'If the checkbox is in column A then check it.
        chk.Value = True
    Case "B"
        'If the checkbox is in column B then un-check it.
        chk.Value = False
    Case "C"
        '... what ever you want for column C
    Case Else
        '... or any other column
    End Select
Next chk

End Sub

如果这解决了您的问题,请告诉我。

答案 2 :(得分:0)

让所有Master-Checkbox的一个宏工作使用调用者并比较topleftcell.column:

Sub CheckComboboxesInColumn()
Dim CallerString As String, CallerBox As CheckBox
Dim chk As CheckBox

    CallerString = Application.Caller
    Set CallerBox = ActiveSheet.CheckBoxes(CallerString)

    For Each chk In ActiveSheet.CheckBoxes
        If chk.TopLeftCell.Column = CallerBox.TopLeftCell.Column Then chk.Value = CallerBox.Value
    Next chk
End Sub