【问题标题】:Excel 2010 Check Boxes Macro - How to deselect a "Select All" checkbox when another box is deselectedExcel 2010 复选框宏 - 如何在取消选择另一个框时取消选择“全选”复选框
【发布时间】:2015-05-08 14:39:43
【问题描述】:

我有一个国家列表和一个 Excel 模型的场景列表。每个列表都有带有“所有国家/地区”和“所有场景”选项的复选框,这些选项将选中与每个国家/地区相关的所有复选框。当我单击“所有国家/地区”复选框时,每个国家/地区的复选框都被正确选中。 “所有场景”复选框相同。但是,如果我取消选择一个国家/方案,所有国家/方案框仍处于选中状态。

当子复选框被取消选中时,如何取消选中“所有国家”和“所有场景”复选框?

下面是我目前的代码。

Sub SelectAll_Read()
    Dim CB As CheckBox
    For Each CB In ActiveSheet.CheckBoxes
        If CB.Name <> ActiveSheet.CheckBoxes("MCB.1").Name And CB.Name <> ActiveSheet.CheckBoxes("MCB.2").Name Then
            If Mid(CB.Name, 5, 1) = "1" Then
                CB.Value = ActiveSheet.CheckBoxes("MCB.1").Value
            ElseIf Mid(CB.Name, 5, 1) = "2" Then
                CB.Value = ActiveSheet.CheckBoxes("MCB.2").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, 5, 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

【问题讨论】:

  • 从您的代码中不清楚复选框是如何按名称相关/分组的。也许你可以解释一下你的命名方案。
  • @Tim Williams - 我将 MCB.1 用于我的“主复选框 1”,即所有国家/地区复选框。然后每个单独的国家/地区是 MCB.1.1、.1.2、.1.3 等等。名称 MCB.2 用作我的所有场景。每个单独的场景是 MCB.2.1、.2.2、.2.3。我希望这可以澄清并感谢您提供的任何帮助

标签: excel checkbox vba


【解决方案1】:

如果您将其分配给工作表上的所有复选框,那么它应该处理同步主子状态。

Sub HandleClick()

    Dim sht As Worksheet, nm As String
    Dim arrA, arrB, masterClicked As Boolean
    Dim c As CheckBox, cb As CheckBox
    Dim mixedChildValues As Boolean

    Set sht = ActiveSheet
    nm = Application.Caller
    Set cb = sht.CheckBoxes(nm) 'the clicked checkbox

    arrA = Split(nm, ".") 'split the cb name on "." to give an array
    masterClicked = (UBound(arrA) = 1) '"master" cb clicked?

    mixedChildValues = False

    'loop over all checkboxes on the sheet
    For Each c In sht.CheckBoxes

        'ignore the clicked checkbox
        If c.Name <> nm Then

            arrB = Split(c.Name, ".") 'split the name...

            If arrA(1) = arrB(1) Then 'only consider same "family" of checkboxes

                If masterClicked Then
                    'set all childern to "master" value if master was clicked
                    c.Value = cb.Value
                Else
                    If (UBound(arrB) = 2) Then 'only look at children...
                        If c.Value <> cb.Value Then
                            mixedChildValues = True
                            Exit For 'no need to check further...
                        End If
                    End If 'child checkbox
                End If

            End If 'same family
        End If 'not the clicked checkbox
    Next c

    'child checkbox was clicked - see if the master needs adjusting...
    If Not masterClicked Then
        sht.CheckBoxes(arrA(0) & "." & arrA(1)).Value = IIf(mixedChildValues, -4146, cb.Value)
    End If

End Sub

【讨论】:

  • 谢谢。我已将其合并到我的文件中,并且效果很好。我也很欣赏这些笔记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多