在multidimensional array上使用ubound的VBA
Ubound可以返回一个数组的最大索引值,但是在一个multidimensional array中,我将如何指定WHICH维度我想要的最大索引?
例如
Dim arr(1 to 4, 1 to 3) As Variant
在这个4x3arrays中,我将如何将Ubound返回4,以及如何将Ubound返回3?
ubound(arr, 1)
和
ubound(arr, 2)
你需要处理UBound
的可选的Rank参数。
Dim arr(1 To 4, 1 To 3) As Variant Debug.Print UBound(arr, 1) '◄ returns 4 Debug.Print UBound(arr, 2) '◄ returns 3
更多: UBound函数(Visual Basic)
[这是一个较迟的回答,说明问题的标题(因为这是人们search时会遇到的问题),而不是OP已经充分回答的问题的具体情况]
Ubound
有点脆弱,因为它没有办法知道一个数组有多less个维度。 您可以使用错误捕获来确定数组的完整布局。 以下返回数组的集合,每个维度一个。 count
属性可用于确定维度的数量,并可根据需要提取其下限和上限:
Function Bounds(A As Variant) As Collection Dim C As New Collection Dim v As Variant, i As Long On Error GoTo exit_function i = 1 Do While True v = Array(LBound(A, i), UBound(A, i)) C.Add v i = i + 1 Loop exit_function: Set Bounds = C End Function
像这样使用:
Sub test() Dim i As Long Dim A(1 To 10, 1 To 5, 4 To 10) As Integer Dim B(1 To 5) As Variant Dim C As Variant Dim sizes As Collection Set sizes = Bounds(A) Debug.Print "A has " & sizes.Count & " dimensions:" For i = 1 To sizes.Count Debug.Print sizes(i)(0) & " to " & sizes(i)(1) Next i Set sizes = Bounds(B) Debug.Print vbCrLf & "B has " & sizes.Count & " dimensions:" For i = 1 To sizes.Count Debug.Print sizes(i)(0) & " to " & sizes(i)(1) Next i Set sizes = Bounds(C) Debug.Print vbCrLf & "C has " & sizes.Count & " dimensions:" For i = 1 To sizes.Count Debug.Print sizes(i)(0) & " to " & sizes(i)(1) Next i End Sub
输出:
A has 3 dimensions: 1 to 10 1 to 5 4 to 10 B has 1 dimensions: 1 to 5 C has 0 dimensions:
除了已经很好的答案之外,还要考虑这个函数来检索维度的数量和边界,这与John的答案类似,但是工作和看起来有点不同:
Function sizeOfArray(arr As Variant) As String Dim str As String Dim numDim As Integer numDim = NumberOfArrayDimensions(arr) str = "Array" For i = 1 To numDim str = str & "(" & LBound(arr, i) & " To " & UBound(arr, i) If Not i = numDim Then str = str & ", " Else str = str & ")" End If Next i sizeOfArray = str End Function Private Function NumberOfArrayDimensions(arr As Variant) As Integer ' By Chip Pearson ' http://www.cpearson.com/excel/vbaarrays.htm Dim Ndx As Integer Dim Res As Integer On Error Resume Next ' Loop, increasing the dimension index Ndx, until an error occurs. ' An error will occur when Ndx exceeds the number of dimension ' in the array. Return Ndx - 1. Do Ndx = Ndx + 1 Res = UBound(arr, Ndx) Loop Until Err.Number <> 0 NumberOfArrayDimensions = Ndx - 1 End Function
用法示例:
Sub arrSizeTester() Dim arr(1 To 2, 3 To 22, 2 To 9, 12 To 18) As Variant Debug.Print sizeOfArray(arr()) End Sub
其输出:
Array(1 To 2, 3 To 22, 2 To 9, 12 To 18)