[英]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.