在Excel VBA脚本中使用单选按钮

3
我正在制作一个宏来复制选定工作表的选定行到另一个工作表。例如,我想把第3、5、6、7行复制到第3个工作表中。我考虑使用复选框选择行并使用单选按钮选择工作表。在我的代码中,我通过单选按钮设置一个变量,并使用该变量决定要将数据复制到哪个工作表中。
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

这里通过选项按钮1或2设置Val变量的值,并且将该值用于Sub CopyRows()函数中。但是,在CopyRows()函数的第4行出现了错误。 *错误信息显示为“下标越界”。* 你是否看出我的逻辑或其他问题?谢谢。(请原谅我在学习阶段可能存在的明显错误)。


点击调试按钮后,它会带你到哪一行代码?当你按下调试按钮后,在单词“Val”上悬停,它显示的数值是多少? - Andy G
@AndyG 根据它的说法,该值为空,但我在其他子程序中分配了“Sheet2”,我想知道为什么会这样。 - VikkyB
1
当模块被重置时,即当您到达“End”语句、单击“End”按钮而不是“Config”按钮、单击VBA编辑器上的方形按钮等情况时,“Val”将返回到“Nothing”。 - stenci
1个回答

8
这并不是回答你问题的真正答案,而是一个关于你所做事情替代方案的建议。复选框和其他表格控件由Excel管理不佳(在多个窗口、分割窗口、大型表格等方面存在问题,无法创建数百个控件等),在VBA或VSTO中难以管理。
我通常会这样做:当用户单击单元格时,Worksheet_SelectionChange检查该单元格是否包含复选框、单选按钮或按钮。当单元格包含字体为Wingdings的文本“¡”或“¤”(作为单选按钮的标志)、“¨”或“þ”(作为复选框的标志)时,它包含或者更确切地说,是相应的控件。
如果所选单元格是单选按钮,则将所有其他单选按钮重置为未选中状态(“¡”),并将所选单选按钮设置为选中状态(“¤”)。
如果所选单元格是复选框,则交换“¨”和“þ”的位置。
如果所选单元格是按钮,则执行与该按钮相关联的代码。
如果所选单元格是复选框或按钮,则该宏还选择另一个没有假控件的单元格,以允许用户再次单击同一控件并再次触发事件。
下面是代码示例。此代码必须位于工作表模块中,而不是代码模块中,以便将被识别为工作表事件并在该工作表的选择更改时触发Worksheet_SelectionChange子程序。
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

这是一个与上面列出的代码配合使用的工作表片段: enter image description here

你好,请问如何运行这个程序? - VikkyB
谢谢您,但是它显示了一个错误 - 参数不是可选的。 - VikkyB
当我在单元格中输入某些值并运行宏时,会出现该错误。 - VikkyB
让我们在聊天中继续这个讨论。 (http://chat.stackoverflow.com/rooms/33510/discussion-between-vikas-bansal-and-stenci) - VikkyB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接