如何在 Excel 中一次只允许打开一个 ToggleButton

How to allow only one ToggleButton to be ON at a time in Excel

我在 excel 2010 年创建了一个用户窗体,并在 it.When 中放置了 10 个切换按钮,我 运行 所有的窗体都可以打开(值 = TRUE),但我想要只有其中之一在下面的 time.Like 相同:

在一个 Class 模块中

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

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

创建多个 Toggle 控件并使用 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(至少 2016 年)在您设置切换控件的值时触发“_Click”事件。烦人且不明显(如果不是彻头彻尾的错误,我会称之为 "errata"),所以我会添加以下内容:

  1. 添加行 If Me.ToggleControlName.Value = False then Exit Sub 作为每个“_Click”事件处理程序的第一行。
  2. 将条件 And Ctl.Value = True 添加到 ToggleClick 子例程的 IF 语句中,以防止额外触发实际上并未更改切换值的“_Click”事件(如果为 False,则无需将其设置为 False ,触发无用的 _Click 事件处理程序)。

即使有 Erik 的修改,我也无法得到 Darren 的答案。下面一行不断抛出错误。

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

唯一的缺点是我可以关闭当前活动的按钮,以便 none 处于活动状态。我希望这样,如果您尝试关闭活动的,它会保持活动状态。所以一键常亮

在用户表单中:

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

在 Class 模块中:

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

'在用户表单中试试这个。

Private Sub ToggleButton1_Click()
    If Me.ToggleButton1.Value = True Then
       Me.ToggleButton2.Value = Not (Me.ToggleButton1.Value)
    Else
       Me.ToggleButton1.Value = Not (Me.ToggleButton2.Value)
End Sub

Private Sub ToggleButton2_Click()
    If Me.ToggleButton2.Value = True Then
       Me.ToggleButton1.Value = Not (Me.ToggleButton2.Value)
    Else
       Me.ToggleButton2.Value = Not (Me.ToggleButton1.Value)
    End If
End Sub

'对我来说完美无缺。 '干杯!