得到数组的长度?

lis*_*aro 48 excel ms-access vba

我正在尝试获取数组的长度,但我一直收到此错误:

所需对象

难道我做错了什么?

Dim columns As Variant
columns = Array( _
"A", "ID", _
"D", "Name")
Debug.Print columns.Length  ' Error: Object required
Run Code Online (Sandbox Code Playgroud)

Ana*_*com 97

数组的长度:

UBound(columns)-LBound(columns)+1

UBound 单独不是获取每个数组长度的最佳方法,因为VBA中的数组可以从不同的索引开始,例如`Dim arr(2到10)

Dim arr(2 to 10)仅当数组基于1时才会返回正确的结果(例如,开始索引为1,例如UBound,在任何其他情况下,它将返回错误的结果,例如Dim arr(1 to 10)

有关 此VBA阵列教程中的VBA阵列的更多信息.

  • 真的?对于像数组长度这样基本的东西,没有本机函数?哇.这似乎非常麻烦,必须使用替代说Len(列). (55认同)
  • @ExcelHero大多数语言只返回第一个维度,然后如果调用第一维子索引,则可以返回第二个维度的长度,依此类推。 (4认同)
  • @excel 英雄 - 我想你会让它像 UBound( ArrayName, [Dimension] ) 一样工作,不是吗? (2认同)

Mar*_*ese 27

功能

Public Function ArrayLen(arr As Variant) As Integer
    ArrayLen = UBound(arr) - LBound(arr) + 1
End Function
Run Code Online (Sandbox Code Playgroud)

用法

Dim arr(1 To 3) As String  ' Array starting at 1 instead of 0: nightmare fuel
Debug.Print ArrayLen(arr)  ' Prints 3.  Everything's going to be ok.
Run Code Online (Sandbox Code Playgroud)


Pav*_*kis 7

如果变量为空,则将引发错误。防弹代码如下:

Public Function GetLength(a As Variant) As Integer
   If IsEmpty(a) Then
      GetLength = 0
   Else
      GetLength = UBound(a) - LBound(a) + 1
   End If
End Function
Run Code Online (Sandbox Code Playgroud)

  • 一个不错的加法+1 :-)-附带说明:如果通过`columns = Array()`分配一个空数组,则所引用的数组不被视为空(实际上不是),该函数`GetLength `在计算`GetLength = UBound(a)-LBound(a)+ 1 = -1 -0 +1 = 0'时正确返回零长度。 (2认同)