web-dev-qa-db-fra.com

VBA utilisant ubound sur un tableau multidimensionnel

Ubound peut renvoyer la valeur d'index max d'un tableau, mais dans un tableau multidimensionnel, comment spécifier quelle dimension dois-je indexer?

Par exemple

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

Dans ce tableau 4x3, comment aurais-je le retour Ubound 4 et comment aurais-je le retour Ubound 3?

32
bsapaka
ubound(arr, 1) 

et

ubound(arr, 2) 
54
Maksim Satsikau

Vous devez gérer le paramètre optionnel Rank de 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

Plus à: Fonction UBound (Visual Basic)

15
user4039065

[Il s’agit d’une réponse tardive concernant le titre de la question (car c’est ce que les gens rencontreraient lors d’une recherche) plutôt que les détails de la question de OP qui a déjà reçu une réponse adéquate]

Ubound est un peu fragile en ce sens qu'il ne fournit aucun moyen de savoir combien de dimensions un tableau a. Vous pouvez utiliser le recouvrement des erreurs pour déterminer la mise en page complète d'un tableau. Ce qui suit renvoie une collection de tableaux, une pour chaque dimension. La propriété count peut être utilisée pour déterminer le nombre de dimensions et leurs limites inférieure et supérieure peuvent être extraites au besoin:

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

Utilisé comme ceci:

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

Sortie:

A has 3 dimensions:
1 to 10
1 to 5
4 to 10

B has 1 dimensions:
1 to 5

C has 0 dimensions:
5
John Coleman

Outre les réponses déjà excellentes, envisagez également cette fonction pour extraire à la fois le nombre de dimensions et leurs limites, ce qui est similaire à réponse de John , mais fonctionne et se présente un peu différemment:

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

Exemple d'utilisation:

Sub arrSizeTester()
    Dim arr(1 To 2, 3 To 22, 2 To 9, 12 To 18) As Variant
    Debug.Print sizeOfArray(arr())
End Sub

Et sa sortie:

Array(1 To 2, 3 To 22, 2 To 9, 12 To 18)
0
Vegard