我正在测试一些VBA代码。在电子表格中,我将范围定义为"Test_Range_1",其中包括列中的10个单元格,并具有a, B, B, C, C, C, D, D, D, D, D。然后像下面运行VBA,我会看到一个显示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
a)VBA中的数组可以从任意索引开始。
Dim a(1 to 10) ' Array with 10 elements from 1 to 10
Dim b(0 to 9) ' Array with 10 elements from 0 to 9
Dim c(-4 to 5) ' Array with 10 elements from -4 to 5
如果您不指定下索引,它将为0 -除非您使用Option Base 1
Dim d(10) ' Array with either 10 or 11 elements
b)Range("Test_Range_1")
是一个Range,而不是一个数组。您可以通过单个索引(从1开始)或通过行和列索引访问Range的单元格。
MsgBox Range("Test_Range_1")(1)
MsgBox Range("Test_Range_1")(1, 1)
将获取Range的第一个单元格。由于Value
是默认属性,因此消息框将显示单元格的内容。
当您使用只有1个参数的语法时,您可以访问索引为0的区域左侧的单元格。如果您使用2个参数(row, col),您甚至可以访问左侧/顶部的更多单元格,例如使用Range("Test_Range_1")(-1, -1)
,假设这些单元格存在。(不要这样做,这真的很令人困惑)。
c)
Rng = Range("Test_Range_1")
你将写一个二维数组的值到Rng
-无论范围是只有一行或一列。无论使用哪个Option Base
,两个索引都从1开始。
唯一的例外是如果区域只包含一个单元格,那么Rng
将获得该单元格的值。
要从Rng
获取值,需要指定两个索引,如
MsgBox Rng(1, 1)
范围对象与数组对象有很大的不同。注意,您可以使用多维数组,这可能会让您感到困惑。
关于range对象的官方文档非常清楚:
" Range的默认成员将不带参数的调用转发给Value属性,并使用参数调用Item成员。因此,someRange = someOtherRange等价于someRange。Value = someOtherRange。值,取值范围为(1)到someRange. item(1)和someRange. item(1,1)到someRange. item (1,1)">
范围对象中的第一项是左上角的单元格。行/列的索引都从1开始,而不是0。因此,当您的范围从A1
开始时,您的第一个代码将出错。如果不是,那么根据@Rory,索引作为范围对象的偏移量。在您的情况下,我假设您有一个空单元格直接在您的范围对象。你的第二段代码将你的值(默认值)加载到一个变量中,该变量包含一个range对象的2D引用。因此,这段代码将出错,因为需要同时引用行/列索引。
如果你的目标是加载实际范围到一个变量,那么Set
一个实际范围变量使用:
Sub Range_Test()
Dim rng As Range: Set rng = Range("Test_Range_1")
Debug.Print rng(1)
Debug.Print rng(1, 1)
Debug.Print rng.Item(1)
Debug.Print rng.Item(1, 1)
End Sub