2014-10-30 37 views
21

Ubound可以返回数组的最大索引值,但在多维数组中,我将如何指定WHICH维度我想要的最大索引是?在多维数组上使用ubound的VBA

例如

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

在该4x3的阵列中,我会如何UBOUND返回4,以及如何将具有UBOUND回报3?

回答

35
ubound(arr, 1) 

ubound(arr, 2) 
9

你需要处理的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 

更多:UBound Function (Visual Basic)

1

[这是一个迟到的回答解决问题的题(因为这是搜索时,人会遇到什么),而不是已经被回答了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: 
0

除了已经很好的答案之外,还可以考虑使用此函数来检索维数及其边界的数量,这与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)