programing

다차원 배열에서 Ubound를 사용한 VBA

bestprogram 2023. 5. 2. 23:02

다차원 배열에서 Ubound를 사용한 VBA

Unbound는 배열의 최대 인덱스 값을 반환할 수 있지만 다차원 배열에서 최대 인덱스를 원하는 차원을 지정하려면 어떻게 해야 합니까?

예를들면

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

추가 위치: U Bound 기능(Visual Basic)

[이것은 이미 적절하게 답변된 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:
  • UBound(myArray, 1)2D 배열의 행 수를 반환합니다.
  • UBound(myArray, 2)2D 배열의 열 수를 반환합니다.

그러나 한 단계 더 나아가 2d 배열로 작성된 범위의 마지막 행과 마지막 열이 필요하다고 가정하겠습니다.해당 행(또는 열)을 1d 배열로 변환해야 합니다.예: 2d 어레이가 다음과 같은 경우:

여기에 이미지 설명 입력

그런 다음 아래 코드를 실행하면 마지막 열과 마지막 행인 21D 배열이 표시됩니다.

Sub PrintMultidimensionalArrayExample()    
    Dim myRange As Range: Set myRange = Range("a1").CurrentRegion        
    Dim myArray As Variant: myArray = myRange        
    Dim lastRowArray As Variant: lastRowArray = GetRowFromMdArray(myArray, UBound(myArray, 1))
    Dim lastColumnArray As Variant
    lastColumnArray = GetColumnFromMdArray(myArray, UBound(myArray, 2))        
End Sub

Function GetColumnFromMdArray(myArray As Variant, myCol As Long) As Variant        
    'returning a column from multidimensional array
    'the returned array is 0-based, but the 0th element is Empty.        
    Dim i As Long
    Dim result As Variant
    Dim size As Long: size = UBound(myArray, 1)
    ReDim result(size)        
    For i = LBound(myArray, 1) To UBound(myArray, 1)
        result(i) = myArray(i, myCol)
    Next        
    GetColumnFromMdArray = result        
End Function

Function GetRowFromMdArray(myArray As Variant, myRow As Long) As Variant        
    'returning a row from multidimensional array
    'the returned array is 0-based, but the 0th element is Empty.        
    Dim i As Long
    Dim result As Variant
    Dim size As Long: size = UBound(myArray, 2)
    ReDim result(size)        
    For i = LBound(myArray, 2) To UBound(myArray, 2)
        result(i) = myArray(myRow, i)
    Next        
    GetRowFromMdArray = result        
End Function

이미 우수한 답변 외에도 이 함수를 고려하여 차원의 수와 경계를 모두 검색합니다. 이는 John의 답변과 비슷하지만 작동하고 약간 다르게 보입니다.

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)

D3 웨이 루핑;

Sub SearchArray()
    Dim arr(3, 2) As Variant
    arr(0, 0) = "A"
    arr(0, 1) = "1"
    arr(0, 2) = "w"

    arr(1, 0) = "B"
    arr(1, 1) = "2"
    arr(1, 2) = "x"

    arr(2, 0) = "C"
    arr(2, 1) = "3"
    arr(2, 2) = "y"

    arr(3, 0) = "D"
    arr(3, 1) = "4"
    arr(3, 2) = "z"

    Debug.Print "Loop Dimension 1"
    For i = 0 To UBound(arr, 1)
        Debug.Print "arr(" & i & ", 0) is " & arr(i, 0)
    Next i
    Debug.Print ""

    Debug.Print "Loop Dimension 2"
    For j = 0 To UBound(arr, 2)
        Debug.Print "arr(0, " & j & ") is " & arr(0, j)
    Next j
    Debug.Print ""

    Debug.Print "Loop Dimension 1 and 2"
    For i = 0 To UBound(arr, 1)
        For j = 0 To UBound(arr, 2)
            Debug.Print "arr(" & i & ", " & j & ") is " & arr(i, j)
        Next j
    Next i
    Debug.Print ""

End Sub

언급URL : https://stackoverflow.com/questions/26644231/vba-using-ubound-on-a-multidimensional-array