Ответ 1
ubound(arr, 1)
и
ubound(arr, 2)
Ubound может возвращать максимальное значение индекса для массива, но в многомерном массиве, как бы я определил размер WHICH, мне нужен максимальный индекс?
Например
Dim arr(1 to 4, 1 to 3) As Variant
В этом массиве 4x3, как бы у меня был Ubound return 4, и как бы у меня был Ubound return 3?
ubound(arr, 1)
и
ubound(arr, 2)
Вам нужно иметь дело с необязательным параметром ранга UBound
.
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)
[Это поздний ответ, посвященный названию вопроса (поскольку это то, с чем люди столкнулись при поиске), а не специфика вопроса ОП, на который уже был дан адекватный ответ]
Ubound
является немного хрупким, поскольку он не дает возможности узнать, сколько измерений имеет массив. Вы можете использовать захват ошибок, чтобы определить полный макет массива. Ниже приводится набор массивов, по одному для каждого измерения. Свойство 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 answer, но работает и выглядит несколько иначе:
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)