如何在Excel中一次只打开一个切换按钮

如何在Excel中一次只打开一个切换按钮,excel,vba,togglebutton,Excel,Vba,Togglebutton,我在excel 2010中创建了一个UserForm,并在其中添加了10个切换按钮。当我运行该表单时,所有表单都可以启用value=TRUE,但我只希望同时启用其中一个。如下所示: 在类模块中 Public WithEvents ToggleGroup As ToggleButton Private Sub ToggleGroup_click() ' code End Sub 以用户形式 Dim Buttons() As New Class1 Private Sub UserF

我在excel 2010中创建了一个UserForm,并在其中添加了10个切换按钮。当我运行该表单时,所有表单都可以启用value=TRUE,但我只希望同时启用其中一个。如下所示:

在类模块中

Public WithEvents ToggleGroup As ToggleButton 

Private Sub ToggleGroup_click() 

' code

End Sub 
以用户形式

Dim Buttons() As New Class1 

Private Sub UserForm_Initialize() 

    Dim ToggleCount     As Integer 
    Dim Ctl             As Control 

    For Each Ctl In UserForm1.Controls 
        If TypeName(Ctl) = "ToggleButton" Then 
            ReDim Preserve Buttons(1 To ToggleCount) 
            Set Buttons(ToggleCount).ToggleGroup = Ctl 
        End If 
    Next Ctl 

End Sub
在模块中

Sub Form()
UserForm1.Show
End Sub

要使用切换按钮,可以尝试以下方法:

创建多个切换控件,并使用Tag属性对按钮进行分组。 下面的代码将比较每个控件的名称和标记。具有相同标记的所有切换按钮将与单击的按钮相反

Private Sub Toggle1_Click()
    ToggleClick Me.ActiveControl
End Sub

Private Sub Toggle2_Click()
    ToggleClick Me.ActiveControl
End Sub

Private Sub Toggle3_Click()
    ToggleClick Me.ActiveControl
End Sub

Private Sub Toggle4_Click()
    ToggleClick Me.ActiveControl
End Sub

Private Sub ToggleClick(ClickedControl As Control)

    Dim Ctl As Control

    For Each Ctl In Me.Controls
        If TypeName(Ctl) = "ToggleButton" Then
            If Ctl.Name <> ClickedControl.Name And Ctl.Tag = ClickedControl.Tag Then
                Ctl.Value = Not ClickedControl.Value
            End If
        End If
    Next Ctl

End Sub

Darren的答案很好,除了一个烦恼:当您设置切换控件的值时,Excel至少会触发_Click事件。恼人且不明显的我甚至称之为勘误表,如果不是一个彻底的错误,那么我将添加以下内容:

如果Me.ToggleControlName.Value=False,则添加该行,然后将Sub作为每个单击事件处理程序的第一行退出。 将条件和Ctl.Value=True添加到ToggleClick子例程的IF语句中,以防止额外触发_-Click事件,这些事件实际上不会更改toggle的值。如果为False,则无需将其设置为False,从而触发无用的_-Click事件处理程序。
即使经过埃里克的修改,我也无法得到达伦的答案。下面的行不断抛出错误

Ctl.Value = Not ClickedControl.Value
下面是一个简单的3个切换系统的简化版本

Private Sub ToggleButton1_Click()
    If Me.ToggleButton1.Value = False Then Exit Sub
    Me.ToggleButton2.Value = False
    Me.ToggleButton3.Value = False
End Sub
Private Sub ToggleButton2_Click()
    If Me.ToggleButton2.Value = False Then Exit Sub
    Me.ToggleButton1.Value = False
    Me.ToggleButton3.Value = False
End Sub
Private Sub ToggleButton3_Click()
    If Me.ToggleButton3.Value = False Then Exit Sub
    Me.ToggleButton1.Value = False
    Me.ToggleButton2.Value = False
End Sub
唯一的缺点是我可以关闭当前活动的按钮,这样就没有活动的按钮。我想这样,如果你试图关闭活动的一个,它保持活跃。因此,一个按钮始终处于打开状态。

在用户表单中:

Dim Buttons() As New Class1

Private Sub UserForm_Initialize()
    Dim ToggleCount     As Integer
    Dim Ctl             As Control

    For Each Ctl In UserForm1.Controls
        If TypeName(Ctl) = "ToggleButton" Then
            ToggleCount = ToggleCount + 1
            ReDim Preserve Buttons(1 To ToggleCount)
            Set Buttons(ToggleCount).ToggleGroup = Ctl
            Buttons(ToggleCount).CtlName = Ctl.Name
        End If
    Next Ctl

End Sub
在类模块中:

Public WithEvents ToggleGroup As ToggleButton
Public CtlName As String

Private Sub ToggleGroup_click()

' code

End Sub

Private Sub ToggleGroup_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim Ctl             As Control

    For Each Ctl In UserForm1.Controls
        If TypeName(Ctl) = "ToggleButton" Then
            If Not Ctl.Name = CtlName Then
                Ctl.Value = False
            End If
        End If
    Next Ctl
End Sub

已经有一段时间了,但是在每个选项按钮的首选项中,您不能将它们都设置为相同的组名,Excel将自动为您执行这些操作。@ScottCraner如何操作?你能给我举个例子吗。tanx选项按钮具有GroupName属性,如果在一个框架内,则连接选项-切换按钮没有此属性。找到了这个解释得很好的网站:从我上面的评论来看,你需要一个选项按钮而不是切换按钮。@Darren Bartrup Cook我需要切换按钮。不管怎样,我真的很喜欢这个。我不需要一个总是开着的额外限制。我只需要两个其他的正确清除时,一个是点击。我这样做是为了当B1被点击时,B2和B3的切换被清除,但是你仍然需要再次点击B1才能使其进入真实状态。这很有效。谢谢