Excel 用户表单选项按钮在两个方向上是独占的
我有一个userform,它的按钮按列和行组织,就像一张表。我只想为每列和每行激活一个按钮。 目前,所有按钮都是选项按钮,同一帧中一行的所有选项按钮都可以使用。 然后,对于列,我开始为每个按钮编写一个子类型:Excel 用户表单选项按钮在两个方向上是独占的,excel,vba,userform,Excel,Vba,Userform,我有一个userform,它的按钮按列和行组织,就像一张表。我只想为每列和每行激活一个按钮。 目前,所有按钮都是选项按钮,同一帧中一行的所有选项按钮都可以使用。 然后,对于列,我开始为每个按钮编写一个子类型: Private Sub Col1Row3_Click() For i = 1 To 2 Me.Controls("col1Row" & i) = False Next i For i = 4 To 14 Me.Controls("col1Row" & i) = Fa
Private Sub Col1Row3_Click()
For i = 1 To 2
Me.Controls("col1Row" & i) = False
Next i
For i = 4 To 14
Me.Controls("col1Row" & i) = False
Next i
End Sub
这是可行的,但我相信有一种更优雅的方式。有什么想法吗?
谢谢 简单子过程 试图通过以下方式演示一种简化代码的简单方法:
Private Sub col1Row3_Click()
Only 3, "col1"
End Sub
进一步提示
与其对每个选项按钮重复过程调用,还可以从类编程中获益(~>
WithEvents
)。为了获得更深入的了解,您可能会感兴趣,例如,您是否希望对共享相同名称类型和类中预定义的相同事件过程的控件进行分组。因此,请在T.M.的帮助下回答我的问题,以防它可以帮助其他人(或其他人有更清晰的建议)
我发现了两种可能性:
如果控件是选项按钮,则每个列和行只允许一个选择:
- 将每一行或每一列放在一个框架中,让我们假设本例中的行
- 使用控件作为属性和控件作为方法创建一个类。该方法检查列的所有控件(如果controls.name的类型为“name”&variable&numcolumn,或由于属性号为column,则按名称查找列)
- 使用控件作为属性和控件作为方法创建一个类。由于类Arr(row of control,col of control)的属性为数组,或者由于控件名为“name”&row&col的名称,该方法检查所有行和列
哦,所以vab控制阵列是一件事。。。我觉得自己很愚蠢。这里解释了一个几乎完全相同的案例:我将尝试调整每列一个数组,并发布代码,如果它对其他人有任何帮助的话。谢谢!不客气。另一个提示:将sub
Only
中的默认参数maxRow
更正为14,因为这似乎是您的常量值-@Groumpf
Private Sub col1Row3_Click()
Only 3, "col1"
End Sub
Public ClickCtrl As Boolean 'the boolean which prevents the checkbox from going crazy
Public WithEvents ControlExcl As MSForms.CheckBox 'the control with events enabled
Private Sub ControlExcl_Click()
If ClickCtrl = False Then 'inhibits reaction to value change
GoTo line1
Else
For Each control2 In UserForm1.Controls
If control2.Name <> ControlExcl.Name Then 'avoid setting the tickbox xhanged to false
If Right(control2.Name, 2) = Right(ControlExcl.Name, 2) Or Mid(control2.Name, 10, 2) _
= Mid(ControlExcl.Name, 10, 2) Then 'same row/col
ClickCtrl = False
control2.Value = False
End If
End If
ClickCtrl = True 'allows the clicks to trigger the code again
Next control2
End If
line1:
End Sub
Dim ArrControls() As New ClassForExclusives 'Set the array with the controls as ClassForExclusives
Private Sub UserForm_Initialize()
ClickCtrl = True
For Each Chkbox In Me.Controls
If TypeOf Chkbox Is MSForms.CheckBox Then
i = i + 1
ReDim Preserve ArrControls(1 To i)
Set ArrControls(i).ControlExcl = Chkbox
End If
Next Chkbox
End Sub