该代码的按钮先前已存在于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
答案 0 :(得分:1)
这里有2个问题。
隐式Worksheets
集合与代码运行时处于活动状态的工作簿相关联,很可能不是是您期望的工作簿。另一个工作簿不一定包含一个工作表,该工作表的名称(从Excel的工作表选项卡上可以看到)为“ Sheet1”。
假定预期的工作簿处于活动状态,则从Excel来看,如果Worksheets("Sheet1")
的工作表均不带有名称“ Sheet1”,则它将失败并显示“下标超出范围”。请注意,任何给定的工作表都具有Name
和CodeName
属性。 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
获取该对象。