繁体   English   中英

使用用户表单输入工作簿作为参考时下标超出范围

[英]Subscript out of range when using Userform input workbook as reference

我已经为用户组合了一个用户表单来选择一个打开的工作簿 - 理想情况下希望将其与脚本集成,以便脚本根据所选工作簿运行。 但是,运行脚本时会出现超出范围的错误:


Private Sub Go_Click()

 If ComboBox1.ListIndex = -1 Then
        MsgBox "Please select a workbook name and try again"
        Exit Sub
    End If

    Dim wb As Workbook, copytest As Range, pastetest As Range

    Set wb = Workbooks(ComboBox1.List(ComboBox1.ListIndex))


   Set copytest = wb.Worksheets(2).Columns(6)
   Set pastetest = Workbooks("VBA Workbook.xlsx").Worksheets(1).Columns(1)
   copytest.Copy Destination:=pastetest

        '~~> Do what you want

Debug.Print

End Sub

组合框:

Private Sub UserForm_Initialize()


    Dim wkb As Workbook
    Me.Label1.Caption = "Please select the relevant workbook"
    With Me.ComboBox1
        '~~> Loop thorugh all open workbooks and add
        '~~> their name to the Combobox
        For Each wkb In Application.Workbooks
            .AddItem wkb.Name
        Next wkb
    End With
End Sub

.ListIndex返回一个从 0 到 ListCount - 1 的数字(将其视为基于零的数组)。 因此,当您为第 1 个项目传递 0 时(如果选择了该项目),则 Workbooks(0) 将因超出范围错误而失败。 其他任何东西都将被列表中的一项关闭,最后一项将永远无法使用。

相应地调整您的代码(即,将 1 添加到.ListIndex )。 提示:这就是为什么 -1 表示组合框中没有任何内容被选中。

通常,您会想要检查wb是否不是空的。 为了能够做到这一点,您可以将分配行wb = Workbooks(ComboBox1.List(ComboBox1.ListIndex))On Error Resume Next / On Error GoTo 0包裹起来。 这将暂停您最初遇到的错误并让您的代码继续,以便您可以检查If Not wb Is Nothing Then并相应地继续。

说了这么多,我建议您使用有意义的名称而不是Combobox1 此外,您没有提供如何.Show您的用户表单。 确保您没有使用默认实例,并为您的用户表单提供一个有意义的名称,并且您为其设置的对象也具有一个有意义的名称。 以后你会感谢自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM