Подтвердить что ты не робот

VBA с использованием ubound на многомерном массиве

Ubound может возвращать максимальное значение индекса для массива, но в многомерном массиве, как бы я определил размер WHICH, мне нужен максимальный индекс?

Например

Dim arr(1 to 4, 1 to 3) As Variant

В этом массиве 4x3, как бы у меня был Ubound return 4, и как бы у меня был Ubound return 3?

4b9b3361

Ответ 1

ubound(arr, 1) 

и

ubound(arr, 2) 

Ответ 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)

Ответ 3

[Это поздний ответ, посвященный названию вопроса (поскольку это то, с чем люди столкнулись при поиске), а не специфика вопроса ОП, на который уже был дан адекватный ответ]

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:

Ответ 4

В дополнение к уже отличным ответам, также рассмотрите эту функцию для получения как количества измерений, так и их границ, что похоже на 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)