VBA中Range引用的两个疑问:索引0返回空值与下标越界
VBA Range索引与赋值问题解析
我正在测试VBA代码,在电子表格中定义了名为Test_Range_1的单元格区域,该区域为一列10个单元格,内容依次为A、B、B、C、C、C、D、D、D、D。运行如下代码时,消息框会显示A:
Sub Range_Test() MsgBox (Range("Test_Range_1")(1)) End Sub
技术疑问
- 若将代码修改为
MsgBox (Range("Test_Range_1")(0)),消息框会显示空值。但我理解范围/数组索引通常从0开始,为何此处引用索引0返回空值? - 若将代码修改为如下形式,先将Rng赋值为该单元格区域,运行时会提示“下标越界”错误。为何前一段代码可行,此段却报错?两段代码本质看似一致,原因是什么?
Sub Range_Test() Rng = Range("Test_Range_1") MsgBox Rng(1) End Sub
问题解答
疑问1:索引0返回空值的原因
VBA中直接通过Range("Test_Range_1")(index)调用的是Range对象的默认成员Item属性,而Item属性的索引规则是从1开始——这是VBA针对单元格区域的设计规范,和常规数组的0起始逻辑不同。当传入索引0时,超出了Item属性的有效索引范围,因此返回空值。
疑问2:赋值后下标越界的原因
两段代码的操作对象完全不同:
- 第一段代码里,
Range("Test_Range_1")是Range对象,后面的(1)是调用Range的Item属性,该属性支持单个索引参数,按从上到下、从左到右的顺序定位单元格,再通过单元格的默认成员Value显示内容,因此可以正常运行。 - 第二段代码中,未声明
Rng为Range对象时,Rng = Range("Test_Range_1")会自动将Range区域的Value属性值赋值给Rng,此时Rng变成一个二维Variant数组(对应单元格区域的行和列结构)。对于单列10行的区域,这个数组的索引格式为Rng(行号, 列号),必须同时指定两个下标才能取值。你只写Rng(1),不符合二维数组的访问规则,因此触发“下标越界”错误。如果要正常获取第一个单元格的值,应写成MsgBox Rng(1, 1)。
内容的提问来源于stack exchange,提问作者LaTeXFan
相关产品推荐
相关产品推荐

