Uboundは配列の最大インデックス値を返すことができますが、多次元配列では、最大インデックスが必要な次元をどのように指定しますか?
例えば
Dim arr(1 to 4, 1 to 3) As Variant
この4x3配列では、Uboundが4を返し、Uboundが3を返す方法を教えてください。
ubound(arr, 1)
そして
ubound(arr, 2)
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
[これは、すでに適切に回答された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:
すでに優れた答えに加えて、次元数とその境界の両方を取得するこの関数も考慮してください。これは 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)