在Excel vba脚本中使用单选button

我正在构build一个macros来将选定的行从工作表复制到选定的工作表。 例如,我想复制第3,5,6,7行到第3页。我想过使用checkboxselect行和单选button来select表。 在我的代码中,我通过单选button设置了一个variables,该variables用于决定数据必须被复制的工作表。

Public Val As String Public Sub OptionButton1_Click() If OptionButton1.Value = True Then Val = "Sheet2" End Sub Public Sub OptionButton2_Click() If OptionButton2.Value = True Then Val = "Sheet3" End Sub Sub Addcheckboxes() Dim cell, LRow As Single Dim chkbx As CheckBox Dim MyLeft, MyTop, MyHeight, MyWidth As Double Application.ScreenUpdating = False LRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row For cell = 2 To LRow If Cells(cell, "A").Value <> "" Then MyLeft = Cells(cell, "E").Left MyTop = Cells(cell, "E").Top MyHeight = Cells(cell, "E").Height MyWidth = Cells(cell, "E").Width ActiveSheet.CheckBoxes.Add(MyLeft, MyTop, MyWidth, MyHeight).Select With Selection .Caption = "" .Value = xlOff .Display3DShading = False End With End If Next cell Application.ScreenUpdating = True End Sub Sub CopyRows() For Each chkbx In ActiveSheet.CheckBoxes If chkbx.Value = 1 Then For r = 1 To Rows.Count If Cells(r, 1).Top = chkbx.Top Then With Worksheets(Val) LRow = .Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & LRow & ":AF" & LRow) = _ Worksheets("Sheet1").Range("A" & r & ":AF" & r).Value End With Exit For End If Next r End If Next End Sub 

Valvariables是由选项button1或2设置在这里。该值正在使用Sub CopyRows()但我在CopyRows()第4行得到一个错误。 * 它说“下标超出范围”。 *你看到我的逻辑或其他任何问题? 谢谢。 (请原谅,因为我还处在学习阶段)。

这不是你的问题的答案,这是一个关于你在做什么的替代scheme的build议。 它不适合发表评论,所以我把它写在这里作为答案。

我学会了远离纸张上的checkbox和其他控件。 他们没有很好的Excelpipe理(问题与多个窗口工作,拆分窗口,大张,不可能创build数百控件等),并难以pipe理的VBA或VSTO。

我通常做这样的事情:当用户点击一个单元格时, Worksheet_SelectionChange检查该单元格是否包含checkbox,单选button或button。 单元格包含或更确切地说是一个单选button,当它包含文本“¡”或“¤”(字体Wingdings)时,包含文本“¨”或“þ”(又是Wingdings)的checkbox,一个button,当它包含任何文字,你决定它是一个button。

如果选中的单元格是一个单选button,则macros将所有其他无线电重置为未选中状态(“¡”),并将所选单元格设置为“¤”。

如果选中的单元格是checkbox,则macros将“¨”与“þ”交换。

如果它是一个button,macros执行与button相关的代码。

如果所选单元格是一个checkbox或一个button,macros也会select另一个单元格(没有假控件),以允许用户单击相同的控件并再次触发事件。

这是一个代码的例子。 此代码必须位于工作表模块中,而不是位于代码模块中,因此称为Worksheet_SelectionChange的子项被识别为工作表事件,并在该工作表上的select发生更改时触发。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'exit if the selected range contains more than one cell If Target.Columns.Count > 1 Then Exit Sub If Target.Rows.Count > 1 Then Exit Sub 'check for radio buttons If Target.Text = "¡" Then Application.EnableEvents = False Range("B1:B3") = "¡" Target = "¤" Application.EnableEvents = True End If 'check for check boxes If Target.Text = "þ" Then Application.EnableEvents = False Target = "¨" Target.Offset(0, 1).Select Application.EnableEvents = True ElseIf Target.Text = "¨" Then Application.EnableEvents = False Target = "þ" Target.Offset(0, 1).Select Application.EnableEvents = True End If 'check for button Dim Txt As String If Target.Text = "[Show stats]" Then Txt = "Radio 1 = " & IIf(Range("B1") = "¤", "Yes", "No") & vbLf Txt = Txt & "Radio 2 = " & IIf(Range("B2") = "¤", "Yes", "No") & vbLf Txt = Txt & "Radio 3 = " & IIf(Range("B3") = "¤", "Yes", "No") & vbLf Txt = Txt & "Check 1 = " & IIf(Range("B5") = "þ", "Yes", "No") & vbLf Txt = Txt & "Check 2 = " & IIf(Range("B6") = "þ", "Yes", "No") & vbLf MsgBox Txt Application.EnableEvents = False Target.Offset(0, 1).Select Application.EnableEvents = True End If End Sub 

以下是与上面列出的代码一起使用的工作表片段:

在这里输入图像描述