我正在测试一些VBA代码。在电子表格中,我定义了一个范围为“Test_Range_1”,其中包括10个单元格在一列中,并有A,B,B,C,C,C,D,D,D,D。然后运行VBA如下,我会看到一个消息框显示A。
Sub Range_Test()
MsgBox (Range("Test_Range_1")(1))
End Sub
我的问题如下:
1.如果我修改代码为MsgBox (Range("Test_Range_1")(0))
,那么消息框将显示空白。然而,据我所知,范围/数组索引总是从0开始。为什么在这种情况下,引用0会给予我空白?
1.如果我修改代码如下,即,设置Rng
为相同的范围,作为电子表格第一,然后它会给予我错误说下标超出范围。我不知道为什么以前的代码工作,但这并不。看起来像在本质上相同给我。为什么?Sub Range_Test() Rng = Range("Test_Range_1") MsgBox Rng(1) End Sub
2条答案
按热度按时间goqiplq21#
**a)**VBA中的数组可以从任何索引开始。
如果不指定较低的索引,则它将为0 -除非使用
Option Base 1
B)
Range("Test_Range_1")
是一个Range,而不是数组。您可以通过单个索引(从1开始)或行和列索引访问Range的单元格。将获取Range的第一个单元格。由于
Value
是默认属性,因此消息框将显示单元格的内容。当你只使用1个参数的语法时,你可以访问索引为0的区域左边的单元格。如果你使用2个参数(row,col),你甚至可以访问左边/顶部的更多单元格,例如使用
Range("Test_Range_1")(-1, -1)
,假设这些单元格存在。(不要这样做,这真的很混乱)。**c)**有
您将向
Rng
写入值的二维数组-无论Range是否只有一行或一列。无论您使用的是什么Option Base
,两个索引都从1开始。唯一的例外是,如果范围只包含一个单元格,则
Rng
将获取单元格的值。要从
Rng
获取值,需要指定两个索引,如tez616oj2#
range对象与array对象有很大的不同。注意,你可以有多维数组,这可能是你在这里混淆的原因?
关于range对象的官方文档非常清楚:
range对象中的第一项是左上角的单元格。行/列的索引都从1开始,而不是零。因此,当您的range从
A1
开始时,您的第一个代码将出错。如果不是,然后按照@Rory,index作为range对象的偏移量。在你的例子中,我假设你在range对象的正上方有一个空单元格。你的第二段代码将你的值(默认值)加载到一个包含range对象的2D引用的variant变量中。因此,这段代码将出错,因为你需要同时引用行/列索引。如果您的目标是将实际范围加载到变量中,则
Set
实际范围变量使用: