我正在创建一个Excel工作表,其中将根据特定参数的值自动生成单选按钮。请参阅此内容以获得清晰的理解:
一组单选按钮被复制n
次。其中n
是引用参数的行数。
应根据条件检查此自动生成的矩阵中的每个单选按钮,并在与条件匹配的一组中将十二个单选按钮之一设置为True。这里的主要复杂之处在于,每组单选按钮会根据需求复制到所需的行,因此,单选按钮会生成n * 12次,并且我不知道如何对自动生成的每个单选按钮进行编程。
我需要知道可以使用哪个功能来满足我的要求。
我用以下代码创建了矩阵:
Dim n, m, i, j, x, k, a As Integer
n = (Sheets("ALLO").Range("E4").Value) * 2
x = Sheets("ALLO").Range("E3").Value
m = (Sheets("ALLO").Range("E5").Value) + 1
a = m
For i = 2 To n Step 2
Sheets("Dummy_Result").Range("A2:M2").Copy Destination:=Sheets("Results").Range("A" & i)
Next i
For j = 3 To n Step 2
Sheets("Dummy_Result").Range("A3:M3").Copy Destination:=Sheets("Results").Range("A" & j)
Next j
For k = n + 1 To m Step 1
Sheets("Dummy_Result").Range("A3:M3").Copy Destination:=Sheets("Results").Range("A" & k)
Next k
End Sub
我更新的程序,用于根据'm'的值自动生成范围的按钮。生成的按钮数量应与“ m”的值成正比。当我使用动态范围而不是固定范围(如Mr.JosephC所建议)时,此程序不起作用
Sub Test()
Dim n, m, i, j, x, k, a As Integer
n = (Sheets("ALLO").Range("E4").Value) * 2 'No of Tack stations
x = Sheets("ALLO").Range("E3").Value
m = (Sheets("ALLO").Range("E5").Value) + 1
a = m
For i = 2 To n Step 2 'Correct
Sheets("Dummy_Result").Range("A2").Copy Destination:=Sheets("Results_1").Range("A" & i)
Call AddOptionButtons(Sheets("Results_1").Range("B & m: M & m"))
Next i
For j = 3 To n Step 2
Sheets("Dummy_Result").Range("A3").Copy Destination:=Sheets("Results_1").Range("A" & j)
Call AddOptionButtons(Sheets("Results_1").Range("B & m: M & m"))
Next j
For k = n + 1 To m Step 1
Sheets("Dummy_Result").Range("A3").Copy Destination:=Sheets("Results_1").Range("A" & k)
Call AddOptionButtons(Sheets("Results_1").Range("B & m: M & m"))
Next k
End Sub
Private Sub AddOptionButtons(ByRef TargetRange As Range)
Dim oCell As Range
For Each oCell In TargetRange
oCell.RowHeight = 20
oCell.ColumnWidth = 6
Dim oOptionButton As OLEObject
Set oOptionButton = TargetRange.Worksheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Left:=oCell.Left + 1, Top:=oCell.Top + 1, Width:=15, Height:=18)
oOptionButton.Name = "ob" & oCell.row & "_" & oCell.Column
'oOptionButton.Object.Caption = "Button" oOptionButton.Object.GroupName = "grp" & oCell.Top
Next
End Sub**strong text**
答案 0 :(得分:2)
这只是让您入门的方法。假设您有6个这样的“表单控件选项”按钮:
然后,如果您将它们传递到数组buttons1
中,则可以根据条件True
的另一个数组,通过它们的索引遍历它们并将它们的值分配给condition1
:>
Public Sub TestMe()
Dim condition1 As Variant
condition1 = Array(False, True, False, False, False, False)
Dim buttons1 As Variant
buttons1 = Array("Option Button 2", "Option Button 3", "Option Button 4", _
"Option Button 5", "Option Button 6", "Option Button 7")
Dim cnt As Long
For cnt = LBound(buttons1) To UBound(buttons1)
With Worksheets(1).Shapes(buttons1(cnt)).OLEFormat
If condition1(cnt) Then .Object.Value = True
End With
Next cnt
End Sub
因此,在运行代码后,只要condition1
数组中的第二个单元为True
,就选择了Option Button 3
。
答案 1 :(得分:1)
这会将选项按钮添加到目标范围内的每个单元格。它将稍微调整单元格的大小,以尝试为其留出足够的空间(您可以随意调整选项按钮的位置和单元格的大小)。它将根据在它们中设置的行和列编号为其选项按钮的“索引”值命名。 ob2_4是第2行第4列(D)中的选项按钮。还将同一行中所有选项按钮的组名设置为相同。
Sub Test()
Call AddOptionButtons(Sheet1.Range("B5:D7"))
End Sub
Private Sub AddOptionButtons(ByRef TargetRange As Range)
Dim oCell As Range
For Each oCell In TargetRange
oCell.RowHeight = 20
oCell.ColumnWidth = 6
Dim oOptionButton As OLEObject
Set oOptionButton = TargetRange.Worksheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Left:=oCell.Left + 1, Top:=oCell.Top + 1, Width:=15, Height:=18)
oOptionButton.Name = "ob" & oCell.Row & "_" & oCell.Column 'Name them to make it easier if you need to access them later
'oOptionButton.Object.Caption = "Caption" ' If you want to add text to the buttons
oOptionButton.Object.GroupName = "grp" & oCell.Top
Next
End Sub
个人笔记: 顺便说一句,请为变量使用有意义的名称。 :)唯一应该使用单个字符变量的时间是,如果您对代码占用的空间有硬件要求。