2014-10-30 4 views
21

उबाउंड एक सरणी के अधिकतम सूचकांक मान को वापस कर सकता है, लेकिन एक बहुआयामी सरणी में, मैं कैसे निर्दिष्ट करूं कि अधिकतम आयाम मैं किस सूचकांक को चाहता हूं?वीबीए एक बहुआयामी सरणी पर यूबाउंड का उपयोग कर

उदाहरण

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

इस 4x3 सरणी में लिए

, मैं कैसे वापसी 4 Ubound होता, और मैं कैसे 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

[यह एक देर से जवाब सवाल के शीर्षक को संबोधित कर रहे है बल्कि ओपी के प्रश्न की बारीकियों जो पहले से ही उत्तर दिया गया है की तुलना में (के बाद से है कि लोगों को मिलती हैं क्या मुठभेड़ होता है) पर्याप्त]

Ubound थोड़ा नाजुक है कि यह जानने के लिए कोई तरीका नहीं है कि सरणी के कितने आयाम हैं। आप सरणी के पूर्ण लेआउट को निर्धारित करने के लिए त्रुटि फँसाने का उपयोग कर सकते हैं। निम्नलिखित प्रत्येक आयाम के लिए एक सरणी का संग्रह देता है। count संपत्ति आयाम की संख्या का निर्धारण करने के लिए इस्तेमाल किया जा सकता है और उनके लोअर और अपर सीमा की जरूरत के रूप में निकाला जा सकता है:

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

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 

इस तरह प्रयुक्त

पहले से ही उत्कृष्ट उत्तरों के अलावा, इस फ़ंक्शन को आयामों और उनकी सीमाओं की संख्या दोनों को पुनर्प्राप्त करने के लिए भी विचार करें, जो John's answer के समान है, b केन्द्र शासित प्रदेशों के काम करता है और थोड़ा अलग दिखता है:

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) 
संबंधित मुद्दे