VBA中的数组下标 - 任何人都可以解释这个吗?

时间:2014-03-27 13:48:00

标签: arrays excel vba excel-vba

请附上我编写的一个小测试程序的截图,以说明我遇到的困惑。 <>中的文字由我输入来解释我得到的错误。

enter image description here

创建MsgBox是为了让程序保持中断模式,以便我可以看到值是什么。

这是代码。 (我已经放弃了早期版本,但值仍应相同)

Sub test()
Dim Test1()
Dim Test2()

'values hardcoded in the sheet from where this macro is launched
'Cells(7,4) = 1
'Cells(7,5) = 2
'Cells(7,6) = 3
'Cells(7,7) = 4
'Cells(7,8) = 5
'Cells(7,9) = 6
'Cells(7,10) = 7


Set Rng1 = Range(Cells(7, 4), Cells(7, 10))
Test1 = Rng1.Value2
ReDim Test2(4)
Test2 = Rng1.Value2
MsgBox ("This was a test program")

End Sub

我的问题

  1. 这是一个单行数组 - 那么为什么Excel将它作为二维数组?
  2. 通常第一行和第一行从0开始,即零。那么为什么我必须使用1来访问数组选择的值?或者为什么第0行和第0列会出错?
  3. 即使Redim语句强制它有4个值,为什么它会获得第五个值?这是否意味着我们不必担心如果可能遇到更多的值而对数组进行Redimensioning并且Excel总是需要它?
  4. 提前多多感谢。

2 个答案:

答案 0 :(得分:3)

如果从一个范围获得一个数组,它几乎总是一个二维数组。例外情况是单个单元格的范围。

修改#1

要验证Ubounds和Lbounds,请尝试运行 MAIN

Sub SizeAndShape(ary)
    MsgBox LBound(ary, 1) & "-" & UBound(ary, 1) & vbCrLf & LBound(ary, 2) & "-" & UBound(ary, 2)
End Sub

Sub MAIN()
    Set Rng1 = Range(Cells(7, 4), Cells(7, 10))
    Test1 = Rng1.Value2
    Call SizeAndShape(Test1)
End Sub

答案 1 :(得分:2)

看起来您只是用您设置为Rng1的范围覆盖数组。在

的代码之后
Test2 = Rng1.Value2

这意味着您的数组不是ReDim编辑的数组,而是Excel的Value2属性返回的值数组,这是一个基于1的2D数组,{1}中每个单元格的一个值{1}}。

所以,是的,除非指定,否则数组基于0,但Rng1属性返回的数组在返回一系列值时为1。 (如果您在单个单元格而不是一系列单元格上调用Value2,则只需获得一个变体。)