EXCEL - VBA

엑셀 VBA - 배열(2)

별동산 2022. 12. 7. 08:55
반응형

5. ReDim

가. 정의

ReDim을 배열의 크기를 재설정하는 것입니다.
처음에는 배열의 크기를 모르거나 배열의 크기가 유동적으로 변하는 경우 사용합니다.


나. ReDim 문

데이터는 아래와 같이 작성했습니다.


Dim intNum(3) As Integer라고 이미 배열의 크기를 선언한 상태에서
ReDim intNum(5)라고 하면 아래와 같이 에러가 발생합니다.


따라서, 배열의 크기는 지정하지 않고,
Dim intNum() as integer라고 한 다음
ReDim intNum(5)라고 해야 에러가 발생하지 않습니다.
그다음부터는 ReDim intNum(6)이라고 해도 에러가 발생하지 않습니다.

Option Explicit
Option Base 1

Sub 변수선언()
    Dim i As Integer
    Dim int1 As Integer, int2 As Integer, int3 As Integer
    Dim intNum() As Integer
    
    ReDim intNum(3)    
    
    int1 = Range("a1"): int2 = Range("a2"): int3 = Range("a3")
    Debug.Print int1
    Debug.Print int2
    Debug.Print int3
    
    For i = 1 To 3
        intNum(i) = Range("a" & i)
        Debug.Print intNum(i)
    Next
    
    ReDim intNum(5)
    For i = 4 To 5
        intNum(i) = Range("a" & i)
        Debug.Print intNum(i)
    Next
    
End Sub


위 코드를 실행하면 intNum배열이 3개였다가 5개로 재 선언되면서 초기화되기 때문에 intNum(1부터 3까지)는 0이 되고,
intNum(4)와 intNum(5)만 값이 할당됩니다. 그대로 sub 프로시저가 실행되면 다시 intNum 배열이 초기화되기 때문에 Next 왼쪽 기둥에 중단점을 설정하고 실행 아이콘을 두 번 누른 상태입니다.



다. ReDim Preserve 문

배열을 재 선언하면서 기존 값은 유지되도록 하는 것입니다.

(예제 1)
위와 같은 경우 ReDim Preserve intNum(5)이라고 하면 intNum(1부터 3까지)의 값이 보존되기 때문에 For i=4 to 5를 하더라도 intNum(1부터 5까지)의 값이 모두 할당됩니다.


(예제 2)
맨 끝에 ReDim Preserve intNum(3)라고 선언해서 intNum의 크기를 3개로 재 선언하면 preserve가 있기 때문에 3개의 값이 보존됩니다.


Preserve경우 배열의 마지막 차원의 크기만 조정할 수 있습니다. 다른 모든 차원의 경우에는 기존 배열의 범위를 지정해야 합니다.


6. 2차원, 3차원 배열

가. 2차원 배열

Dim intNum2(x, y)라고 지정하면 2차원 배열을 선언한 것이고,
Dim intNum2(x, y, z)라고 지정하면 3차원 배열을 선언하는 것입니다.

엑셀은 2차원 배열 형태로 되어 있으므로 2차원 배열이 적합합니다.

(예제 1)
위에서 데이터가 3열 5행으로 되어 있으므로
아래와 같이 코드를 작성하고

Sub 변수선언2()
    Dim i As Integer, j As Integer
    Dim intNum2(5, 3) As Integer
    
    For i = 1 To 3
        For j = 1 To 5
            intNum2(j, i) = Cells(j, i)
            Debug.Print intNum2(j, i)
        Next
    Next
End Sub


실행하면 행별 열 별로 엑셀 시트의 데이터를 직접 실행창에 표시합니다.


intNum2를 조사식에 추가하고 배열의 요소를 살펴보면 아래와 같습니다.


(예제 2)
만약 열 별 행별로 데이터를 표시하려면
아래와 같이 행과 열에 해당하는 값을 수정하고, j, i를 i, j로 수정하면 됩니다.

Sub 변수선언3()
    Dim i As Integer, j As Integer
    Dim intNum2(5, 3) As Integer
    
    For i = 1 To 5
        For j = 1 To 3
            intNum2(i, j) = Cells(i, j)
            Debug.Print intNum2(i, j)
        Next
    Next
End Sub


나. ReDim문

ReDim문은 변수를 재정의하기 때문에 1차원과 2차원의 크기를 모두 바꿀 수 있습니다.

Sub 변수선언4()
    Dim i As Integer, j As Integer
    Dim intNum2() As Integer
    ReDim intNum2(3, 2)
    
    For i = 1 To 3
        For j = 1 To 2
            intNum2(i, j) = Cells(i, j)
            Debug.Print intNum2(i, j)
        Next
    Next
    
    ReDim intNum2(4, 3)
    For i = 1 To 3
        For j = 1 To 3
            intNum2(i, j) = Cells(i, j)
            Debug.Print intNum2(i, j)
        Next
    Next
End Sub


다. ReDim Preserve 문

그러나, Preserve를 사용할 때는 마지막 차원의 크기만 변경해얒 하기때문에 아래와 같이 이전 차원의 크기까지 변경하면 에러가 발생합니다.

아래와 같이 코드를 작성하고

Sub 변수선언5()
    Dim i As Integer, j As Integer
    Dim intNum2() As Integer
    ReDim intNum2(3, 2)
    
    For i = 1 To 3
        For j = 1 To 2
            intNum2(i, j) = Cells(i, j)
            Debug.Print intNum2(i, j)
        Next
    Next
    
    ReDim Preserve intNum2(4, 3)
    For i = 1 To 3
        For j = 1 To 3
            intNum2(i, j) = Cells(i, j)
            Debug.Print intNum2(i, j)
        Next
    Next
End Sub


실행하면 '아래 첨자 사용이 잘못되었다'라고 에러가 발생합니다. 디버그 버튼을 누르면


ReDim Preserve 문이 노란색으로 표시되면서 멈춥니다.


이 때는 표준 도구 모음에서 네모로 된 재설정(중지) 아이콘을 눌러 실행을 멈춰야 합니다.

개별변수와 배열2.xlsm
0.02MB

반응형