【问题标题】:How to allow only one ToggleButton to be ON at a time in Excel如何在 Excel 中一次只允许一个 ToggleButton 开启
【发布时间】:2016-02-24 03:31:34
【问题描述】:

我在 excel 2010 中创建了一个用户表单,并在其中放置了 10 个切换按钮。当我运行表单时,它们都可以为 ON(值 = TRUE),但我希望它们中只有一个同时为 ON。如下:

在类模块中

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

【问题讨论】:

  • 已经有一段时间了,但是在每个选项按钮的首选项中,你不能将它们都设置为相同的组名,Excel会自动为你做。
  • @ScottCraner 怎么样?你能给我举个例子吗?坦克
  • 选项按钮具有 GroupName 属性,如果在框架内,则加入选项 - 切换按钮没有此属性。找到这个解释得很好的网站:globaliconnect.com/excel/…
  • 从我上面的评论看来你需要一个选项按钮而不是一个切换按钮。
  • @Darren Bartrup-Cook 我需要切换按钮。反正就是坦克

标签: excel vba togglebutton


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在用户窗体中:

    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
    

    【讨论】:

      【解决方案3】:

      即使使用 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
      

      唯一的缺点是我可以关闭当前活动的按钮,这样没有一个是活动的。我希望这样,如果您尝试关闭活动的,它会保持活动状态。所以一个按钮总是打开的。

      【讨论】:

      • 我其实很喜欢这个。我不需要一个总是打开的额外限制。当一个被点击时,我只需要另外两个来正确清除。我已经这样做了,以便在单击 B1 时清除切换 B2 和 B3,但是您仍然必须再次单击 B1(使其变为 True 状态)。这非常有效。谢谢。
      【解决方案4】:

      Darren 的回答很好,除了一个烦恼:当您设置切换控件的值时,Excel(至少 2016 年)会触发“_Click”事件。烦人且不明显(如果不是彻头彻尾的错误,我什至称它为“勘误表”),所以我会添加以下内容:

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

      【讨论】:

        【解决方案5】:

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

        创建多个 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
        

        【讨论】:

          猜你喜欢
          • 2020-08-11
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-26
          • 2012-09-17
          • 2021-02-04
          相关资源
          最近更新 更多