用户窗体中的按钮执行抛出下标超出范围错误

时间:2018-12-21 18:19:35

标签: excel vba excel-vba

该代码的按钮先前已存在于Excel工作表中,已经过测试并成功执行。现在我已将该按钮转换为用户窗体,当执行该命令时出现错误“下标超出范围”。使用步进调试时 第1行工作表(“ Sheet1”)。Columns(5).ClearContents.I无法发生错误 找出故障。

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

2 个答案:

答案 0 :(得分:1)

这里有2个问题。

  1. 隐式Worksheets集合与代码运行时处于活动状态的工作簿相关联,很可能不是是您期望的工作簿。另一个工作簿不一定包含一个工作表,该工作表的名称(从Excel的工作表选项卡上可以看到)为“ Sheet1”。

  2. 假定预期的工作簿处于活动状态,则从Excel来看,如果Worksheets("Sheet1")的工作表均不带有名称“ Sheet1”,则它将失败并显示“下标超出范围”。请注意,任何给定的工作表都具有NameCodeName属性。 Name从Excel中可以看到,并且随时可能更改。 CodeName从Visual Basic编辑器的(名称)下的工作表属性中可以看到。您可以根据自己的喜好设置此名称,该名称将随着时间的推移保持稳定。您可以直接在代码中使用它,就像在代码的后两行中一样。

如果要在执行代码的工作簿中使用CodeName Sheet1操作工作表,请直接在4行代码上使用Sheet1;不要为Worksheets集合而烦恼。

答案 1 :(得分:1)

当按钮位于工作表的代码后方时,ActiveWorkbook被保证为ThisWorkbook

现在它位于用户窗体中,ActiveWorkbook是显示表单时工作簿中处于活动状态的任何东西,甚至可以在显示表单时更改 ,具体取决于什么代码在那里。

不合格的Worksheets调用隐式地指向ActiveWorkbook:就像他们隐式地那样做:

ActiveWorkbook.Worksheets("Sheet1")...

可能会工作,但是如果活动工作簿不是预期的那样,则(如果有人去了)并将选项卡/工作表名称从Sheet1更改为Summary 2018-12-21 ,然后它会中断:“下标超出范围”表示要查询的是任何工作簿,其中都没有名为“ Sheet1”的工作表。

另一方面,这些...

Sheet1.Cells(....)

正在使用工作表的代号-与用户可修改的标签名称无关。篡改这些内容的唯一方法是调出VBA编辑器,在Project Explorer中找到工作表(Ctrl + R),然后在“属性”工具窗口(F4)中更改其(Name)属性。

如果所有4条指令均意味着要处理同一张纸并且该纸在ThisWorkbook(即具有VBA代码的文件)的编译时存在,则使它们全部在Sheet1下工作-不要不会从ThisWorkbook.Worksheets获取该对象,甚至不会从ActiveWorkbook.Worksheets获取该对象。