다차원 배열에서 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
'programing' 카테고리의 다른 글
Excel에서 GUID를 만드는 방법은 무엇입니까? (0) | 2023.05.02 |
---|---|
SQL 서버 백업을 Azure SQL 데이터베이스로 복원 (0) | 2023.05.02 |
Mac OS X에서 프로젝트를 컴파일할 때 시스템 키체인을 사용하려고 합니다. (0) | 2023.05.02 |
Git를 설치하지 않고 git diff 패치를 적용하는 방법은? (0) | 2023.05.02 |
MongoDB 페이지에 대한 범위 쿼리 (0) | 2023.05.02 |