如果其他复选框被选中为 true,则取消选中其他复选框

问题描述 投票:0回答:1

我有一个工作表,其中包含 3 个表单控件复选框,而不是 ActiveX(复选框 16、复选框 17 和复选框 18),并且所有这些都链接到单元格 - 因为它们链接到它们的单元格,所以我无法使用 IF 函数如果有一个复选框为 true,则将其他复选框设置为 false...如果有一个复选框被选中为 true,其他两个复选框未被选中,请我需要您的帮助来解决此问题

excel vba checkbox
1个回答
1
投票

因此,如果您确实需要复选框,则需要对更改事件做出反应。

在常规 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
© www.soinside.com 2019 - 2024. All rights reserved.