excel - 使用用户窗体输入工作簿作为参考时下标超出范围
问题描述
我已经整理了一个用户表单,供用户选择一个打开的工作簿 - 理想情况下希望将其与脚本集成,以便脚本参考所选工作簿运行。但是,运行脚本时会出现超出范围的错误:
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 的数字(将其视为基于零的数组)。因此,当您为第一个项目传递 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
的用户表单。确保您没有使用默认实例,并为您的用户表单提供一个有意义的名称,并且您将其设置为的对象也具有一个有意义的名称。以后你会感谢自己的。
推荐阅读
- c# - C# 发生无效凭据时是否可以知道用户名?
- bash - Bash,按文件名中的日期,获取文件名相似的最后 3 个文件
- matlab - 在 MATLAB 中调试错误“连接的数组的维度不一致”
- nestjs - 发生SQL错误时,是否可以在nestjs + typeorm中包含行号和文件名?
- javascript - 如何使用 React 显示我从 API 请求的对象
- c++ - 为什么 C++ 中的字符数组返回其项目而不是其地址?
- javascript - 通过服务器端呈现的 DataTable 排序
- javascript - 为什么 Javascript 在我的 Flask 应用程序中不起作用?
- javascript - 事务号只允许在支持文档级锁定的存储引擎上使用 - MongodbMemoryServer/Mochai/Chai/Supertest
- c# - 在.net中调用python函数