VBA using ubound on a multidimensional array
You need to deal with the optional Rank parameter of UBound
.
Dim arr(1 To 4, 1 To 3) As VariantDebug.Print UBound(arr, 1) '◄ returns 4Debug.Print UBound(arr, 2) '◄ returns 3
More at: UBound Function (Visual Basic)
[This is a late answer addressing the title of the question (since that is what people would encounter when searching) rather than the specifics of OP's question which has already been answered adequately]
Ubound
is a bit fragile in that it provides no way to know how many dimensions an array has. You can use error trapping to determine the full layout of an array. The following returns a collection of arrays, one for each dimension. The count
property can be used to determine the number of dimensions and their lower and upper bounds can be extracted as needed:
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 Loopexit_function: Set Bounds = CEnd Function
Used like this:
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 iEnd Sub
Output:
A has 3 dimensions:1 to 101 to 54 to 10B has 1 dimensions:1 to 5C has 0 dimensions: