存储在变体中的数组的LBound

时间:2017-02-22 11:51:43

标签: arrays vba

在这个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

2 个答案:

答案 0 :(得分:1)

变体数组是Variant类型的动态数组 这些是使用" = Array()"初始化的。

优势

因为使用" = Array()"初始化它们,LBoundUBound函数即使没有元素也可以使用它们:

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)

这是因为RangeVariant的分配总是会产生一个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