首页 > 解决方案 > 使用用户窗体输入工作簿作为参考时下标超出范围

问题描述

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


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

标签: excelvba

解决方案


.ListIndex返回一个从 0 到 ListCount - 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的用户表单。确保您没有使用默认实例,并为您的用户表单提供一个有意义的名称,并且您将其设置为的对象也具有一个有意义的名称。以后你会感谢自己的。


推荐阅读