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?
ubound(arr, 1)
et
ubound(arr, 2)
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)
[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:
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)