我有一个工作表,其中包含 3 个表单控件复选框,而不是 ActiveX(复选框 16、复选框 17 和复选框 18),并且所有这些都链接到单元格 - 因为它们链接到它们的单元格,所以我无法使用 IF 函数如果有一个复选框为 true,则将其他复选框设置为 false...如果有一个复选框被选中为 true,其他两个复选框未被选中,请我需要您的帮助来解决此问题
因此,如果您确实需要复选框,则需要对更改事件做出反应。
在常规 VBA 模块中,添加以下代码(请注意,这仅适用于表单控件)
Sub Checkbox_Click()
HandleCheckboxGroup Application.caller, Array("Check Box 16", "Check Box 17", "Check Box 18")
End Sub
Sub HandleCheckboxGroup(caller, checkBoxList)
With ActiveSheet
Dim currentCheckBox As CheckBox
Set currentCheckBox = .Shapes(caller).OLEFormat.Object
If currentCheckBox.Value <> xlOn Then Exit Sub ' Not check, nothing to do.
Dim checkBoxName
For Each checkBoxName In checkBoxList
If caller <> checkBoxName Then
.Shapes(checkBoxName).OLEFormat.Object.Value = xlOff
End If
Next
End With
End Sub
将宏
Checkbox_Click
分配给所有复选框。仔细查看该例程中复选框数组中的名称,如果您有不同的复选框名称,请对其进行调整(如果我是您,我会给它们提供更有意义的名称)。
Application.Caller
将告诉哪个复选框名为 Checkbox_Click
(它是一个给出名称的字符串)。该名称与一起处理的复选框数组一起传递给 HandleCheckboxGroup
(您可以有另一组以类似方式处理的复选框)。
HandleCheckboxGroup
会首先检查当前的CheckBox是否被选中(如果没有选中,则无事可做)。要获取真正的 CheckBox 对象,您需要找到具有复选框名称的形状(Caller)。对于该形状,使用属性 OLEFormat.Object
获取复选框对象。
现在例程将循环遍历该组的所有复选框名称。如果名称与调用者不同,它将重置该值(至
xlOff
)。
更新
对复选框进行分组时,需要更改代码。分组形状不是工作表
Shapes
集合的一部分(只有组本身才是),相反,您可以通过属性 GroupItems
访问组的形状。不幸的是,GroupItems
的形状无法通过名称访问,只能通过索引访问。因此我们需要对它们循环两次。
事件处理程序例程现在传递组的名称 - 将其设置为您的组的名称。
Sub Checkbox_Click()
HandleCheckboxes Application.caller, "Group 4"
End Sub
Sub HandleCheckboxes(caller, groupName)
Dim group As Shape
Set group = ActiveSheet.Shapes(groupName)
Dim sh As Shape
' First loop: Find the current checkbox within group
For Each sh In group.GroupItems
If sh.Name = caller Then
Dim currentCheckBox As CheckBox
Set currentCheckBox = sh.OLEFormat.Object
If currentCheckBox.Value <> xlOn Then Exit Sub ' Nothing to do
Exit For
End If
Next
' Second loop: Reset all other checkboxes within group
For Each sh In group.GroupItems
If sh.Name <> caller And sh.Type = msoFormControl Then
sh.OLEFormat.Object.Value = xlOff
End If
Next
End Sub