web-dev-qa-db-ja.com

多次元配列でuboundを使用するVBA

Uboundは配列の最大インデックス値を返すことができますが、多次元配列では、最大インデックスが必要な次元をどのように指定しますか?

例えば

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

この4x3配列では、Uboundが4を返し、Uboundが3を返す方法を教えてください。

32
bsapaka
ubound(arr, 1) 

そして

ubound(arr, 2) 
54
Maksim Satsikau

UBoundのオプションRankパラメーターを処理する必要があります。

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

詳細: Bound Function(Visual Basic)

15
user4039065

[これは、すでに適切に回答されたOPの質問の詳細ではなく、質問のタイトルに対応する遅い回答です(これは検索時に人々が遭遇するものであるためです)]

Uboundは、配列の次元数を知る方法を提供しないという点で少し脆弱です。エラートラップを使用して、配列の完全なレイアウトを決定できます。次は、各次元に1つずつ、配列のコレクションを返します。 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:
5
John Coleman

すでに優れた答えに加えて、次元数とその境界の両方を取得するこの関数も考慮してください。これは John's 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)
0
Vegard