请附上我编写的一个小测试程序的截图,以说明我遇到的困惑。 <>中的文字由我输入来解释我得到的错误。
创建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
我的问题
Redim
语句强制它有4个值,为什么它会获得第五个值?这是否意味着我们不必担心如果可能遇到更多的值而对数组进行Redimensioning并且Excel总是需要它?提前多多感谢。
答案 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
,则只需获得一个变体。)