如何在 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"),所以我会添加以下内容:
- 添加行
If Me.ToggleControlName.Value = False then Exit Sub
作为每个“_Click”事件处理程序的第一行。
- 将条件
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
'对我来说完美无缺。
'干杯!
我在 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"),所以我会添加以下内容:
- 添加行
If Me.ToggleControlName.Value = False then Exit Sub
作为每个“_Click”事件处理程序的第一行。 - 将条件
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
'对我来说完美无缺。 '干杯!