excel VBA中的范围引用

1yjd4xko  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(131)

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

goqiplq2

goqiplq21#

**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写入值的二维数组-无论Range是否只有一行或一列。无论您使用的是什么Option Base,两个索引都从1开始。
唯一的例外是,如果范围只包含一个单元格,则Rng将获取单元格的值。
要从Rng获取值,需要指定两个索引,如

MsgBox Rng(1, 1)
tez616oj

tez616oj2#

range对象与array对象有很大的不同。注意,你可以有多维数组,这可能是你在这里混淆的原因?
关于range对象的官方文档非常清楚:

  • “Range的默认成员将不带参数的调用转发到Value属性,并将带参数的调用转发到Item成员。因此,someRange = someOtherRange等效于someRange.Value = someOtherRange.Value、someRange(1)到someRange.Item(1)以及someRange(1,1)到someRange.Item(1,1)"*

range对象中的第一项是左上角的单元格。行/列的索引都从1开始,而不是零。因此,当您的range从A1开始时,您的第一个代码将出错。如果不是,然后按照@Rory,index作为range对象的偏移量。在你的例子中,我假设你在range对象的正上方有一个空单元格。你的第二段代码将你的值(默认值)加载到一个包含range对象的2D引用的variant变量中。因此,这段代码将出错,因为你需要同时引用行/列索引。
如果您的目标是将实际范围加载到变量中,则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

相关问题