选项按钮现在在两个组框
我想创建一个选项按钮(或复选框,如果你发现更好地工作)的数组,其中只有一个选项可以在每个行和列中选择。 我正在尝试这样做,以便用户可以选择某个列表的顺序。选项按钮现在在两个组框
下面的代码获取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
我遍历所有的复选框解析自己的名字,以确定他们在其中的行和列被点击了哪些复选框后。
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
的使用GroupName属性宏的一部分选项按钮。 GroupName属性决定选项按钮的组。用户将只能从组中选择一个选项按钮。 为您的五个选项按钮设置相同的组名,其他五个选项按钮相同。
例如:
- 选项1组名:GRP1
- 选项2组名:GRP1
- 选项3组名:GRP2
- 选项4组名:GRP2
在上述情况下用户将能够从选项1和选项2中选择一个。选项3和选项4中的一个按钮。
的OP使用窗体控件这不有GroupName属性。此外,他规定:“每行和每列只能选择一个选项” – 2017-08-02 09:05:43
这是完美的!差不多。我应该添加的唯一的事情是,这只有在标题的数量是单个数字时才有效。这是因为这一行: 如果check.Name像“R#C#”然后 只检查单个数字。但是这给了我一个很好的框架。 谢谢 –
我的快速修复,因为我怀疑这将有超过99个选项是: 如果check.Name像“R#C#”或check.Name像“R#C##”或check.Name像“R# #C#“或check.Name像”R ## C##“然后 但如果你有更好的解决方案,我全部耳朵 –
好点我编辑我的答案改变''Like'比较字符串到'”R#* C#*“'。这应该解释所有实例。 – 2017-08-03 00:53:06