본문 바로가기
  • Welcome!
VBA VB.Net Code

배열(array) #2

by ToolBOX01 2022. 9. 14.
반응형

□ 동적 배열이란?

 동적 배열은 프로그램 실행 중에 크기를 조절할 수 있는 배열을 의미합니다. 즉, 미리 정해진 고정된 크기가 아닌, 필요에 따라 크기를 늘리거나 줄일 수 있다는 것이죠. 이는 데이터의 양이 미리 예측하기 어려울 때 매우 유용합니다.

▷ 왜 동적 배열을 사용해야 할까요?

  • 유연성: 데이터의 양이 변하더라도 프로그램을 수정하지 않고도 배열 크기를 조절할 수 있습니다.
  • 메모리 효율성: 필요한 만큼의 메모리만 할당하여 불필요한 메모리 낭비를 줄일 수 있습니다.

예제

Dim myArray() As Variant

'// 배열 초기화 (예: 5개의 요소를 가진 배열 생성)
ReDim myArray(1 To 5)

'// 배열 크기 변경 (예: 10개의 요소로 확장)
ReDim Preserve myArray(1 To 10)
  • ReDim: 배열의 크기를 재설정합니다. 기존 데이터는 모두 삭제됩니다.
  • ReDim Preserve: 배열의 크기를 재설정하면서 기존 데이터는 유지합니다.

ReDim Preserve 주의사항

  • 차원: 배열의 차원을 변경할 수 없습니다. 1차원 배열은 항상 1차원 배열로 유지해야 합니다.
  • 하한 인덱스: 하한 인덱스는 변경할 수 없습니다. 항상 동일하게 유지해야 합니다.
  • 상한 인덱스: 상한 인덱스만 변경할 수 있습니다. 즉, 배열의 크기를 늘리는 것은 가능하지만 줄이는 것은 기존 데이터를 유지하면서 불가능합니다.

예시: 워크시트의 데이터를 동적 배열에 저장하기
- 워크시트의 A열 데이터를 동적 배열에 저장하고, 각 값을 Immediate 창에 출력하는 코드입니다.

Sub DynamicArrayExample()
    Dim myArray() As Variant
    Dim lastRow As Long

    ' 마지막 행 찾기
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    ' 동적 배열 크기 설정
    ReDim myArray(1 To lastRow)

    ' 데이터 복사
    For i = 1 To lastRow
        myArray(i) = Cells(i, "A").Value
    Next i

    ' 동적 배열의 값 출력 (예: Immediate 창)
    For Each item In myArray
        Debug.Print item
    Next item
End Sub

* 주의 사항

  • Variant형: 동적 배열은 주로 Variant형으로 선언합니다. Variant형은 다양한 데이터 형식을 저장할 수 있어 유연합니다.
  • Option Base: Option Base 1을 사용하면 배열의 시작 인덱스를 1로 설정할 수 있습니다.
  • LBound, UBound: 배열의 하한 인덱스와 상한 인덱스를 확인할 때 사용합니다.

□ 예제 : Option Base 1 사용 예

예제 1: 워크시트 데이터를 동적 배열에 저장하기

Option Base 1 ' 배열의 시작 인덱스를 1로 설정
Sub WorksheetDataToDynamicArray()
    Dim myArray() As Variant
    Dim lastRow As Long

    ' 마지막 행 찾기
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    ' 동적 배열 크기 설정
    ReDim myArray(1 To lastRow)

    ' 데이터 복사
    For i = 1 To lastRow
        myArray(i) = Cells(i, "A").Value
    Next i

    ' 동적 배열의 값 출력 (Immediate 창)
    For Each item In myArray
        Debug.Print item
    Next item
End Sub
  • Option Base 1: 코드 시작 부분에 선언하여 모든 배열의 시작 인덱스를 1로 설정합니다.
  • ReDim myArray(1 To lastRow): 배열의 크기를 1부터 마지막 행까지로 설정합니다.
  • For i = 1 To lastRow: 반복문에서도 인덱스를 1부터 시작하여 데이터를 복사합니다.

예제 2: 랜덤 숫자 생성 및 정렬

Option Base 1
Sub GenerateAndSortRandomNumbers()
    Dim randomNumbers() As Integer
    Dim i As Long, j As Long, temp As Integer
    Dim numCount As Integer

    numCount = 10 ' 생성할 랜덤 숫자 개수

    ' 동적 배열 크기 설정
    ReDim randomNumbers(1 To numCount)

    ' 랜덤 숫자 생성
    Randomize
    For i = 1 To numCount
        randomNumbers(i) = Int((100 * Rnd) + 1)
    Next i

    ' 버블 정렬
    For i = 1 To numCount - 1
        For j = i + 1 To numCount
            If randomNumbers(i) > randomNumbers(j) Then
                temp = randomNumbers(i)
                randomNumbers(i) = randomNumbers(j)
                randomNumbers(j) = temp
            End If
        Next j
    Next i

    ' 정렬된 숫자 출력 (Immediate 창)
    For Each number In randomNumbers
        Debug.Print number
    Next number
End Sub

 

  • 랜덤 숫자를 생성하고 버블 정렬 알고리즘을 사용하여 정렬하는 예제입니다.
  • Option Base 1 덕분에 배열 인덱스를 1부터 시작하여 코드 가독성이 향상됩니다.

□ 예제 :  LBound와 UBound를 사용한 코드 예시

 

Option Explicit ' 변수 선언 필수

Sub LBound_UBound_Example()
    Dim myArray(1 To 10) As Integer
    Dim i As Integer

    ' 배열에 값 할당
    For i = LBound(myArray) To UBound(myArray)
        myArray(i) = i * 2
    Next i

    ' 배열의 모든 요소 출력 (Immediate 창)
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i

    ' 배열의 크기 출력 (Immediate 창)
    Debug.Print "배열의 크기: " & (UBound(myArray) - LBound(myArray) + 1)
End Sub

 

  • Option Explicit: 모든 변수를 선언하도록 강제하여 오류를 줄입니다.
  • Dim myArray(1 To 10) As Integer: 1부터 10까지의 인덱스를 가진 정수형 배열을 선언합니다.
  • For i = LBound(myArray) To UBound(myArray): LBound와 UBound를 사용하여 배열의 모든 요소를 순회합니다.
  • myArray(i) = i * 2: 각 요소에 인덱스의 두 배 값을 할당합니다.
  • Debug.Print myArray(i): 각 요소의 값을 Immediate 창에 출력합니다.
  • Debug.Print "배열의 크기: " & (UBound(myArray) - LBound(myArray) + 1): 배열의 크기를 계산하여 출력합니다.

▷다차원 배열:

▷Dim my2DArray(1 To 3, 1 To 5) As Double
For i = LBound(my2DArray, 1) To UBound(my2DArray, 1)
    For j = LBound(my2DArray, 2) To UBound(my2DArray, 2)
        ' 2차원 배열의 각 요소 처리
    Next j
Next i
 
1. 2차원 배열 선언:
  • Dim my2DArray(1 To 3, 1 To 5) As Double:
    • my2DArray라는 이름의 2차원 배열을 선언합니다.
    • 첫 번째 차원은 1부터 3까지, 두 번째 차원은 1부터 5까지의 인덱스를 가집니다.
    • 각 요소의 자료형은 Double형 (실수형)입니다.
    • 즉, 3행 5열의 표 형태로 데이터를 저장할 수 있는 공간을 만든 것입니다.

2. 이중 반복문:

  • For i = LBound(my2DArray, 1) To UBound(my2DArray, 1):
    • 첫 번째 차원(행)을 순회하는 반복문입니다.
    • LBound(my2DArray, 1)은 첫 번째 차원의 시작 인덱스를 의미하며, 이 경우 1입니다.
    • UBound(my2DArray, 1)은 첫 번째 차원의 끝 인덱스를 의미하며, 이 경우 3입니다.
  • For j = LBound(my2DArray, 2) To UBound(my2DArray, 2):
    • 두 번째 차원(열)을 순회하는 반복문입니다.
    • LBound(my2DArray, 2)은 두 번째 차원의 시작 인덱스를 의미하며, 이 경우 1입니다.
    • UBound(my2DArray, 2)은 두 번째 차원의 끝 인덱스를 의미하며, 이 경우 5입니다.

3. 2차원 배열의 각 요소 처리:

  • ' 2차원 배열의 각 요소 처리:
    • 위에서 설정된 두 개의 반복문을 통해 my2DArray의 모든 요소를 순서대로 접근할 수 있습니다.
    • 이 부분에 실제로 각 요소를 처리하는 코드를 작성하면 됩니다. 예를 들어, 각 요소에 값을 할당하거나, 값을 출력하거나, 특정 연산을 수행할 수 있습니다.

LBound와 UBound 함수의 역할:

  • LBound(배열, 차원): 지정된 차원의 배열에서 가장 작은 인덱스를 반환합니다.
  • UBound(배열, 차원): 지정된 차원의 배열에서 가장 큰 인덱스를 반환합니다.
  • 위 코드에서는 LBound와 UBound를 사용하여 배열의 시작과 끝 인덱스를 동적으로 구하여 반복문의 범위를 설정합니다. 이렇게 하면 배열의 크기가 변경되더라도 코드를 수정하지 않고도 모든 요소를 처리할 수 있습니다.

 

▷ my2DArray의 각 요소에 해당 행과 열의 곱을 할당합니다.

For i = LBound(my2DArray, 1) To UBound(my2DArray, 1)
    For j = LBound(my2DArray, 2) To UBound(my2DArray, 2)
        my2DArray(i, j) = i * j ' 각 요소에 행 번호와 열 번호의 곱을 할당
    Next j
Next i

위 코드는 2차원 배열의 모든 요소를 순차적으로 처리하는 일반적인 방법을 보여줍니다. LBound와 UBound 함수를 사용하여 배열의 크기를 동적으로 파악하고, 이중 반복문을 통해 모든 요소에 접근합니다. 이러한 방식은 다양한 2차원 배열 처리 작업에 활용될 수 있습니다.


'VBA VB.Net Code' 카테고리의 다른 글

사용자 정의 Sub 프로시저  (0) 2022.09.15
재귀 함수  (0) 2022.09.15
배열(array) #1  (0) 2022.09.07
VAB 딜레이  (0) 2021.03.30
엑셀 - 차트 만들기  (0) 2021.03.20