提问人:Keebo 提问时间:11/16/2023 更新时间:11/16/2023 访问量:39
Excel - 创建 Marlett 复选框 组功能
Excel - Create Marlett checkboxes Group Functionality
问:
我正在使用 Excel 单元格创建复选框功能。我一直在研究VBA代码:
- 允许双击单元格的功能,该单元格输入(或删除)在单元格值中用“a”表示的 Marlett 复选/勾选。即,通过双击,输入或删除单元格“a”。
- 双击功能适用于一组单元格 B1:B10,其中:
- 双击单元格 B1 将同时切换单元格 B1 和单元格 B2:B10 中的“a”,并且
- 双击任何单元格 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 等),此功能可以重复用于更多组。只是为了清楚起见 - 每个组都不会影响任何其他组的功能。
我是编码的新手,所以我被难住了,并希望提供任何解决方案。
答:
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
愚蠢的我在设置时犯了一个错误。我已经更新了代码,该行需要newValue
newValue = IIf(target = checked, vbNullString, checked)
0赞
Keebo
11/17/2023
效果很好,谢谢!
评论