【问题标题】:Selecting specific check boxes using a master check box使用主复选框选择特定复选框
【发布时间】:2016-04-29 14:56:34
【问题描述】:

我正在尝试创建一个宏来选择某一列的所有复选框。 例如,我每列有 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

我尝试更改复选框名称的 , = 以识别比列 B 的第一个复选框更少的内容,但未成功 以及添加 =range()

我对这一切都是全新的,我相信随着时间的推移和学习,我会回顾并嘲笑我在这里遇到的障碍,但如果有人可以暂时将他们的专业知识借给我,那就是非常感谢。

谢谢

【问题讨论】:

  • 你在用什么——表单控件还是activex控件?
  • 表单控件**抱歉
  • 我已经浏览了建议的帖子。我没有选择所有复选框或取消选择所有复选框,这是我想要为每列一个复选框,只选择它下面的框。例如A1 中的复选框选择所有 A:A 但在 B、C、D 列中没有选择。

标签: excel vba


【解决方案1】:

要让一个宏适用于所有主复选框,请使用调用者并比较 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

【讨论】:

  • 这正是我最初想要的,谢谢。因为我已经用一个按钮换掉了我的主复选框,所以我试图更改字符串以识别按钮但失败了,所以我将电子表格转换回所有复选框。我假设它比将前导复选框标识符替换为按钮更复杂。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回复,我认为这不是我真正想要的。我不想在选择其他列的同时取消选择其他列。我将设置多个主复选框以选中同一列中的所有复选框。所以主复选框是A1,我希望它选择A列中的所有框; B1 中的另一个主复选框,选中 B 列中的所有框。
【解决方案3】:

如果您在工作表中将复选框引用为 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 列中的每个复选框。对于其他列,创建此宏的新版本并更改主复选框的名称。这样,当您单独选择任何复选框时,它会在视觉上“禁用”主复选框。

【讨论】:

  • 非常感谢,刚刚经过测试,每列都有效。唯一的是,“主”复选框始终处于选中状态。每次单击它时,我都可以选择和取消选择整个列,但是检查仍保留在该框中。我在想,如果我可以用一个按钮替换全选复选框,这没什么大不了的,但是看看脚本,那是行不通的。
  • 这很奇怪,在我的测试文件中似乎工作正常。您的模块中是否还有其他代码也可以更改复选框?也许您正在触发另一个事件,然后编辑主复选框。此代码应与按钮一起使用,只需删除对主复选框的检查(由于此循环通过复选框,它不会看到您的主“按钮”)。
  • 再次感谢 swaffe,似乎它正在同时重新选择主复选框,因为它与“跟随”框位于同一列。我确实希望全选复选框与其选择的框在同一列中,有没有办法设置范围而不是整个列?
  • 这个想法是检查该列中的每个复选框以确认它不是主复选框。确保在最后的 If 语句(“复选框 1”)中更新主复选框的名称。
  • 对此非常满意,谢谢!我现在正试图弄清楚如果单独更改任何关联的复选框,如何利用此脚本来更改“主”按钮的状态。而不是全选按钮简单地翻转单元格的状态以检查是否未选中,反之亦然,我试图选择我从tutorial 学到的原始全选复选框代码的一部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2013-05-23
  • 2013-09-29
  • 2022-09-22
  • 2012-07-03
相关资源
最近更新 更多