Excel - 创建 Marlett 复选框 组功能

Excel - Create Marlett checkboxes Group Functionality

提问人:Keebo 提问时间:11/16/2023 更新时间:11/16/2023 访问量:39

问:

我正在使用 Excel 单元格创建复选框功能。我一直在研究VBA代码:

  1. 允许双击单元格的功能,该单元格输入(或删除)在单元格值中用“a”表示的 Marlett 复选/勾选。即,通过双击,输入或删除单元格“a”。
  2. 双击功能适用于一组单元格 B1:B10,其中:
  3. 双击单元格 B1 将同时切换单元格 B1 和单元格 B2:B10 中的“a”,并且
  4. 双击任何单元格 B2:B10 将在该特定单元格中输入和删除“a”之间单独切换。

您可以将 B1 视为“主”控制器(最终我希望此单元格表示类别标题),而 B2:B10 是类别中的项目,可以单独选择或取消选择。 这是工作代码:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Me.Range("B2:B10")) Is Nothing Then
        Cancel = True
        If Target.Value = "a" Then
            Target.Value = vbNullString
        Else
            Target.Value = "a"
            Target.Font.Name = "Marlett"
        End If
    ElseIf Not Intersect(Target, Me.Range("B1")) Is Nothing Then
        Cancel = True
        If Me.Range("B1").Value = "a" Then
            Me.Range("B1").Value = vbNullString
            Me.Range("B2:B10").Value = vbNullString
        Else
            Me.Range("B1").Value = "a"
            Me.Range("B2:B10").Value = "a"
            Me.Range("B2:B10").Font.Name = "Marlett"
        End If
    End If
End Sub

这适用于 1 组行 (B1:B10),但我想将此代码扩展到多组行,其中组内有 1 个“主”控制行,但组中的各个行也可以单独控制。例如,在一个新的附加组 B11:B20 中,B11 单元格将同时切换单元格 B11 和单元格 B12:B20 中的“a”,而 B12:B20 可以在每个特定单元格中分别切换输入和删除“a”。如果添加更多其他组(例如,B21:28、B29:35 等),此功能可以重复用于更多组。只是为了清楚起见 - 每个组都不会影响任何其他组的功能。

我是编码的新手,所以我被难住了,并希望提供任何解决方案。

Excel VBA

评论


答:

1赞 FunThomas 11/16/2023 #1

创建一个处理一个组的子例程。

Sub HandleCheckboxRange(target As Range, masterCell As Range, groupRange As Range)
    Const checked = "a"

    If Intersect(target, groupRange) Is Nothing Then Exit Sub
    Dim newValue As String
    newValue = IIf(target = checked, vbNullString, checked)
    
    If Not Intersect(target, masterCell) Is Nothing Then
        ' Master cell was clicked: Set the whole range
        groupRange.Value = newValue
        groupRange.Font.Name = "Marlett"
    Else
        ' Any other cell of range was clicked: Set only this cell
        target.Value = newValue
        target.Font.Name = "Marlett"
    End If
End Sub

例程需要 3 个参数:第一个是单击的单元格 (),第二个是组的主单元格,第三个是整个组(包括主单元格)的范围。target

在 DoubleClick-Event 中,为要处理的每个组调用此子例程:

Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
    HandleCheckboxRange target, Range("B1"), Range("B1:B10")
    HandleCheckboxRange target, Range("B11"), Range("B11:B20")
    HandleCheckboxRange target, Range("B21"), Range("B21:B28")
    ' (and so on)
    Cancel = True
End Sub

评论

0赞 Keebo 11/16/2023
这已经很接近了!唯一似乎不起作用的是“取消选择”,即从各个复选框中删除“a”。您可以使用每个组中的主单元格切换“a”。您可以在组内的各个单元格中打开“a”,但随后关闭似乎对我不起作用。
0赞 FunThomas 11/16/2023
这很奇怪——它对我有用,我看不出有什么理由它不应该起作用。你试过调试它吗?
0赞 FunThomas 11/16/2023
愚蠢的我在设置时犯了一个错误。我已经更新了代码,该行需要newValuenewValue = IIf(target = checked, vbNullString, checked)
0赞 Keebo 11/17/2023
效果很好,谢谢!