Ubound可以返回数组的最大索引值,但在多维数组中,我将如何指定WHICH维度我想要的最大索引是?在多维数组上使用ubound的VBA
例如
Dim arr(1 to 4, 1 to 3) As Variant
在该4x3的阵列中,我会如何UBOUND返回4,以及如何将具有UBOUND回报3?
Ubound可以返回数组的最大索引值,但在多维数组中,我将如何指定WHICH维度我想要的最大索引是?在多维数组上使用ubound的VBA
例如
Dim arr(1 to 4, 1 to 3) As Variant
在该4x3的阵列中,我会如何UBOUND返回4,以及如何将具有UBOUND回报3?
ubound(arr, 1)
和
ubound(arr, 2)
你需要处理的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
在
[这是一个迟到的回答解决问题的题(因为这是搜索时,人会遇到什么),而不是已经被回答了OP的问题的细节充分]
Ubound
有点脆弱,因为它没有办法知道一个数组有多少维度。您可以使用错误捕获来确定数组的完整布局。以下内容返回数组的集合,每个维度对应一个数组。所述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,b UT的作品,看起来有点不同:
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)