Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 用户表单选项按钮在两个方向上是独占的_Excel_Vba_Userform - Fatal编程技术网

Excel 用户表单选项按钮在两个方向上是独占的

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

我有一个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) = False
Next i

End Sub
这是可行的,但我相信有一种更优雅的方式。有什么想法吗?
谢谢

简单子过程

试图通过以下方式演示一种简化代码的简单方法:

  • 使用子过程
  • 在循环中将所有选项按钮设置为False,并最终将活动按钮再次设置为True 避免复杂循环的示例调用

    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的名称,该方法检查所有行和列
    名为CheckBoxRxCy的复选框示例(即CheckBoxR01C01)

    在模块中(我使用defines声明所有内容)

    类中的ClassForExclusives(当修改勾选框时处理事件的classe)


    哦,所以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