2014-10-30 16 views
21

Ubound kann den maximalen Indexwert eines Arrays zurückgeben, aber in einem mehrdimensionalen Array würde ich angeben, für welche Dimension ich den maximalen Index von?VBA mit ubound auf einem multidimensionalen Array

Zum Beispiel

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

In diesem 4x3-Array, wie würde ich 4 Rückkehr UBound haben, und wie hätte ich Ubound Rückkehr 3?

Antwort

35
ubound(arr, 1) 

und

ubound(arr, 2) 
9

Sie müssen sich mit dem optionalen Rang Parameter von UBound beschäftigen.

Dim arr(1 To 4, 1 To 3) As Variant 
Debug.Print UBound(arr, 1) '◄ returns 4 
Debug.Print UBound(arr, 2) '◄ returns 3 

Mehr auf: UBound Function (Visual Basic)

1

[Dies ist eine späte Antwort des Titels der Frage Adressierung (denn das ist, was die Menschen begegnen würden bei der Suche), anstatt die Besonderheiten der OP Frage, die bereits beantwortet wurde adequate]

Ubound ist ein bisschen fragil, da es keine Möglichkeit gibt zu wissen, wie viele Dimensionen ein Array hat. Sie können die Fehlerbehandlung verwenden, um das vollständige Layout eines Arrays zu ermitteln. Der folgende Befehl gibt eine Auflistung von Arrays zurück, eines für jede Dimension. Die count Eigenschaft kann verwendet werden, um die Anzahl der Dimensionen und ihre untere und obere Grenze zu bestimmen, kann je nach Bedarf entnommen werden:

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 

wie folgt verwendet:

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 

Output:

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

B has 1 dimensions: 
1 to 5 

C has 0 dimensions: 
0

Zusätzlich zu den bereits ausgezeichneten Antworten, betrachten Sie diese Funktion auch, um sowohl die Anzahl der Dimensionen als auch deren Grenzen abzurufen, was ähnlich ist wie John's answer, b ut arbeitet und sieht ein wenig anders:

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 

Beispiel Nutzung:

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

und seine Ausgabe:

Array(1 To 2, 3 To 22, 2 To 9, 12 To 18) 
Verwandte Themen