VBA中的范围引用



我正在测试一些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

我的问题如下:

  1. 如果我将代码修改为MsgBox (Range("Test_Range_1")(0)),则消息框将显示空白。然而,据我所知,范围/数组索引总是从0开始。为什么在这种情况下,参考0会给我空白?

  2. 如果我像下面这样修改代码,即首先将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

最新更新