Excel 从Userform执行按钮引发下标超出范围错误
该代码的按钮以前出现在Excel工作表中,测试并成功执行。现在我已经将该按钮转换为Userform,当执行该按钮时,会出现一个错误 下标超出范围 使用分步调试时 错误发生在第1行Excel 从Userform执行按钮引发下标超出范围错误,excel,vba,Excel,Vba,该代码的按钮以前出现在Excel工作表中,测试并成功执行。现在我已经将该按钮转换为Userform,当执行该按钮时,会出现一个错误 下标超出范围 使用分步调试时 错误发生在第1行 Worksheets("Sheet1").Columns(5).ClearContents 我找不出毛病 Private Sub OUTCLR_Click() Worksheets("Sheet1").Columns(5).ClearContents Worksheets("Sheet1").Colu
Worksheets("Sheet1").Columns(5).ClearContents
我找不出毛病
Private Sub OUTCLR_Click()
Worksheets("Sheet1").Columns(5).ClearContents
Worksheets("Sheet1").Columns(2).ClearContents
Sheet1.Cells(1, 5).Value = "RESULT"
Sheet1.Cells(1, 2).Value = "PROCESSED UNIQUE STRINGS"
End Sub
这里有两个问题
工作表
集合绑定到代码运行时处于活动状态的工作簿,它很可能不是您期望的工作簿。另一个工作簿不一定包含一个工作表,该工作表的名称(从工作表选项卡上的Excel中可以看到)为“Sheet1”工作表(“Sheet1”)
将失败,如果其工作表中没有Excel中显示的名称为“Sheet1”,则“下标超出范围”。请注意,任何给定的工作表都具有Name
和CodeName
属性<代码>名称如Excel中所示,可能随时更改<代码>代码名可以从Visual Basic编辑器中的(名称)下的工作表属性中看到。这个名字,你可以根据自己的喜好设置,随着时间的推移,它会保持稳定。您可以在代码中直接使用它,就像您在代码的最后两行中所做的那样如果您打算在执行代码的工作簿中使用代码名Sheet1操作工作表,请在您的4行代码中直接使用Sheet1;不要费心于
工作表的收集。这里有两个问题
隐式工作表
集合绑定到代码运行时处于活动状态的工作簿,它很可能不是您期望的工作簿。另一个工作簿不一定包含一个工作表,该工作表的名称(从工作表选项卡上的Excel中可以看到)为“Sheet1”
假设预期工作簿处于活动状态,工作表(“Sheet1”)
将失败,如果其工作表中没有Excel中显示的名称为“Sheet1”,则“下标超出范围”。请注意,任何给定的工作表都具有Name
和CodeName
属性<代码>名称
如Excel中所示,可能随时更改<代码>代码名可以从Visual Basic编辑器中的(名称)下的工作表属性中看到。这个名字,你可以根据自己的喜好设置,随着时间的推移,它会保持稳定。您可以在代码中直接使用它,就像您在代码的最后两行中所做的那样
如果您打算在执行代码的工作簿中使用代码名Sheet1操作工作表,请在您的4行代码中直接使用Sheet1;不要费心于
工作表
集合。当按钮位于工作表的代码隐藏中时,活动工作簿
保证是此工作簿
既然它是在用户表单中,ActiveWorkbook
就是在显示表单时恰好处于活动状态的工作簿,而且它甚至可以在显示表单时更改,具体取决于其中的代码
非限定的工作表
调用隐式地引用了ActiveWorkbook
:这就像它们隐式地这样做:
ActiveWorkbook.Worksheets("Sheet1")...
可能有效,但如果活动工作簿不是预期的,或者如果有人去将选项卡/工作表名称从Sheet1
更改为Summary 2018-12-21
,则会中断:“下标超出范围”意味着无论查询什么工作簿,其中都没有名为“Sheet1”的工作表
另一方面,这些
Sheet1.Cells(....)
正在使用工作表的代码名-与用户可修改的选项卡名无关。篡改这些内容的唯一方法是打开VBA编辑器,在项目资源管理器(Ctrl+R)中查找工作表,并在“属性”工具窗口(F4)中更改其(名称)
属性
如果所有4条指令都要处理同一工作表,并且该工作表在编译时存在于
本工作簿中(即带有VBA代码的文件),请将它们全部处理完工作表1
-不要从本工作簿中提取该对象。工作表
,更不用说ActiveWorkbook.worksheet
当按钮位于工作表的代码后面时,ActiveWorkbook
保证是thiswoolk
既然它是在用户表单中,ActiveWorkbook
就是在显示表单时恰好处于活动状态的工作簿,而且它甚至可以在显示表单时更改,具体取决于其中的代码
非限定的工作表
调用隐式地引用了ActiveWorkbook
:这就像它们隐式地这样做:
ActiveWorkbook.Worksheets("Sheet1")...
可能有效,但如果活动工作簿不是预期的,或者如果有人去将选项卡/工作表名称从Sheet1
更改为Summary 2018-12-21
,则会中断:“下标超出范围”意味着无论查询什么工作簿,其中都没有名为“Sheet1”的工作表
另一方面,这些
Sheet1.Cells(....)
正在使用工作表的代码名-与用户可修改的选项卡名无关。篡改这些内容的唯一方法是打开VBA编辑器,在项目资源管理器(Ctrl+R)中查找工作表,并在“属性”工具窗口(F4)中更改其(名称)
属性
如果所有4条指令都要处理同一工作表,并且该工作表在编译时存在于本工作簿中(即带有VBA代码的文件),请将它们全部处理完工作表1
-不要从本工作簿中提取该对象。工作表
,从ActiveWorkbook.Worksheets
您的工作簿中是否有名为“Sheet1”的工作表?*无论活动工作簿是什么,@dwirony<代码>工作表
在此处隐式引用活动工作簿
。这4行是在同一张工作表上工作的吗?为什么不呢?