选项按钮现在在两个组框

问题描述:

我想创建一个选项按钮(或复选框,如果你发现更好地工作)的数组,其中只有一个选项可以在每个行和列中选择。 我正在尝试这样做,以便用户可以选择某个列表的顺序。选项按钮现在在两个组框

下面的代码获取Excel工作表中的列标题,并创建一堆选项按钮x列和x行向下。

Sub Option_Buttons() 

    Dim str As String 

    lCol = Sheets("Headers").UsedRange.Columns.Count 
    Dim OpBtn() As OptionButton 
    ReDim OpBtn(lCol, lCol) As OptionButton 
    Dim GrBx() As GroupBox 
    ReDim GrBx(lCol) As GroupBox 

    Dim i 
    Dim j 
' 
    For i = 1 To lCol 
     Set GrBx(i) = Sheets("OPBTN").GroupBoxes.Add(Cells(i, 1).Left, _ 
          Cells(i, 1).Top, lCol * 50, 17.25) 
     With GrBx(i) 
      .Caption = "" 
      '.Visible = False 
     End With 

     For j = 1 To lCol 
      Set OpBtn(i, j) = Sheets("OPBTN").OptionButtons.Add _ 
          (Cells(i,j).Left, Cells(i, j).Top, 72, 17.25) 
      str = Sheets("Turf").Cells(1, j) 
      check = OpBtn(i, j).Value 

      With OpBtn(i, j) 
       .Caption = str 
       .Value = xlOff ' 
       .LinkedCell = "'OData'!" & Sheets("OData").Cells(i, 1).Address 
       .Display3DShading = False 
     End With 
     Next 
    Next 
End Sub 

有没有什么办法可以让它在每行和列中只存在一个选项? (所以如果有5个列标题,有25个选项按钮,其中只有5个可以选择)。

有什么办法来处理用户不希望选择标题的选项?

我试图避免控制标签的所有可能的用途,因为这是一个需要通过完全使用练成不识字的人,需要被应用到高度可变

我能够使用复选框完成此操作。关键是使用R1C1表示法命名复选框,并将宏(ManageCheckBoxes)分配给所有复选框。标识使用Application.Caller我遍历所有的复选框解析自己的名字,以确定他们在其中的行和列被点击了哪些复选框后。

enter image description here


Sub Option_Buttons() 

    Dim str As String 
    Dim r As Integer, c As Integer 
    Dim check As CheckBox 
    lCol = Sheets("Headers").UsedRange.Columns.Count 
    With Sheets("OPBTN") 
     For r = 1 To lCol 
      For c = 1 To lCol 
       Set check = .CheckBoxes.Add(.Cells(r, c).Left, .Cells(r, c).Top, 72, 17.25) 
       str = Sheets("Turf").Cells(r, c) 

       With check 
        .Caption = str 
        .Value = xlOff     ' 
        .Name = "R" & r & "C" & c 
        .Display3DShading = False 
        .OnAction = "ManageCheckBoxes" 
       End With 
      Next 
     Next 
    End With 
End Sub 

Sub ManageCheckBoxes() 
    Dim arrCaller As Variant, arrCheck As Variant 
    Dim check As CheckBox, ckCaller As CheckBox 

    arrCaller = getRC(Application.Caller) 

    With Sheets("OPBTN") 
     Set ckCaller = .CheckBoxes(Application.Caller) 
     For Each check In .CheckBoxes 
      If ckCaller.Name <> check.Name Then 
       If check.Name Like "R#*C#*" Then 
        arrCheck = getRC(check.Name) 
        If arrCheck(0) = arrCaller(0) Or arrCheck(1) = arrCaller(1) Then 

         check.Value = False 

        End If 
       End If 
      End If 
     Next 
    End With 
End Sub 

Function getRC(sName As String) 
    Dim a(1) As Long 
    Dim arr As Variant 
    arr = Split(sName, "C") 
    a(0) = Right(arr(0), Len(arr(0)) - 1) 
    a(1) = arr(1) 
    getRC = a 
End Function 
+0

这是完美的!差不多。我应该添加的唯一的事情是,这只有在标题的数量是单个数字时才有效。这是因为这一行: 如果check.Name像“R#C#”然后 只检查单个数字。但是这给了我一个很好的框架。 谢谢 –

+0

我的快速修复,因为我怀疑这将有超过99个选项是: 如果check.Name像“R#C#”或check.Name像“R#C##”或check.Name像“R# #C#“或check.Name像”R ## C##“然后 但如果你有更好的解决方案,我全部耳朵 –

+0

好点我编辑我的答案改变''Like'比较字符串到'”R#* C#*“'。这应该解释所有实例。 – 2017-08-03 00:53:06

的使用GroupName属性宏的一部分选项按钮。 GroupName属性决定选项按钮的组。用户将只能从组中选择一个选项按钮。 为您的五个选项按钮设置相同的组名,其他五个选项按钮相同。

例如:

  • 选项1组名:GRP1
  • 选项2组名:GRP1
  • 选项3组名:GRP2
  • 选项4组名:GRP2

在上述情况下用户将能够从选项1和选项2中选择一个。选项3和选项4中的一个按钮。

+0

的OP使用窗体控件这不有GroupName属性。此外,他规定:“每行和每列只能选择一个选项” – 2017-08-02 09:05:43