在这个question中,我得到了一个解决了我的问题的答案,但是当我查看我的代码时,我注意到了一些奇怪的东西。当我将3个数组分配给数组变体时,我可以在locals窗口中看到变体的LBound从0开始(正如预期的那样)但是单个数组LBound从1开始,即使我已经写了Option Base 0
at模块的顶部。这是对的吗?
填充数组的代码
Public Sub FillArray(ByRef data As Variant,
sRange As String)
data = oCurrentWs.Range(sRange) End Sub
答案 0 :(得分:1)
变体数组是Variant类型的动态数组
这些是使用" = Array(
)"初始化的。
优势
因为使用" = Array()
"初始化它们,LBound
和UBound
函数即使没有元素也可以使用它们:
Dim varr As Variant
varr = Array()
Debug.Print LBound(varr) 'Prints 0
Debug.Print UBound(varr) 'Prints -1
现在我们还可以在不检查UBound失败的情况下添加元素
Excel范围使用基础1
当从一个范围直接填充数组时,数组将从1开始而不是0。
有关更多信息,请参阅Cells & Ranges > Working With Arrays
答案 1 :(得分:0)
这是因为Range
向Variant
的分配总是会产生一个1-lowerbounded数组,无论Option Base
设置如何。
正如您在此测试中所看到的那样:
Public Sub FillArray(ByRef data As Variant, sRange As String)
With oCurrentWs.Range(sRange)
ReDim data(0 To .Rows.Count - 1, 0 To .Columns.Count - 1) '<--| this dims 'data' as a 0-based array
data = .Value '<--| this redims 'data' as a 1-based array
End With
End Sub
所以如果真的需要基于0的数组,你必须编写如下代码:
Public Sub FillArray(ByRef data As Variant, sRange As String)
Dim i As Long, j As Long
With oCurrentWs.Range(sRange)
ReDim data(0 To .Rows.Count - 1, 0 To .Columns.Count - 1) '<--| dim 'data' as a zero-based array
For i = 1 To .Rows.Count '<--| loop through referenced range rows
For j = 1 To .Columns.Count '<--| loop through referenced range columns
data(i - 1, j - 1) = .Cells(i, j) '<--| fill each array element individually
Next
Next
End With
End Sub