728x90

배열의 이해


엑셀에서 셀에 대한 개념, 범위 설정에 대한 이해를 했다면, 이제 배열 이해를 하면 엑셀 VBA 다루는 것을 훨씬 더 쉽습니다.


컴퓨터(PC)는 크게 나누어 보면 CPU(연산처리장치), 메모리, 하드디스크 로 구분할 수 있다.

엑셀에서 변수를 선언하고, 배열을 선언하고 값을 할당하는 것은 메모리 공간에 할당되는 것이다.

메모리와 하드디스크의 속도차이는 800배 이상의 차이가 난다.

하드디스크와의 입출력을 조금이라도 빠르게 하기 위한 장치가 SSD 이다. SSD는 하드디스크 대비 5 배 이상 빠른 속도를 낼 수 있으나 수명이 하드디스크에 비해 짧다.


배열 타입을 선언하고 배열 값을 할당하면 할당된 값은 메모리 상에 있다.
이걸 엑셀의 셀에다가 표기하려면 Range를 지정하고 배열을 할당하면 된다.

Sub var_array()

    Dim var(1 To 3) As Integer   
    [A1].CurrentRegion.Clear    '// A1셀의 인접영역에 할당된 값을 전부 제거
    Range("A1:F100").Clear      '// A1:F100 영역에 할당된 값을 전부 제거  
    var(1) = 1
    var(2) = 2
    var(3) = 7
    Range("A1:E1") = var
    Range("A3:C5") = var
End Sub


Dim varTemp 또는 Dim varTemp() 라고 선언한 경우
모든 종류의 데이터 타입(Date, Integer, String, Boolean)을 넣을 수 있다
아래와 같이 데이터 타입을 지정하면 그 데이터 타입에 맞는 데이터만 넣을 수 있다.
Dim varTemp() As Date
Dim varTemp() As Integer
Dim varTemp() As String
Dim varTemp() As Boolean


직접 VBA 코드를 입력하고 결과가 화면에 어떻게 뿌려지는지 살펴보자.

선언된 배열의 크기는 3인데, 1번을 보면 Range("A1:E1") 으로 범위는 5개의 셀을 지정했다.

5개의 셀을 지정한 구간에 배열 var를 할당하니 1,2,7 이 가로로 할당되고, D1셀과 E1셀에는 할당할 값이 없어서 #N/A 로 표기된 것을 알 수 있다.

2번을 보면 Range("A3:C5") 로 범위를 3 X 3 으로 셀을 지정했고, 여기에 배열 var를 할당하면 어떤 결과가 나오는가 봤더니 1, 2, 7 이란 값이 동일하게 3번 반복되어 표기된 것을 알 수 있다.

선언된 변수가 Dim var(1 to 3) As Integer 로 1차원 배열이기 때문이다.



여기서 확인할 수 있는 사항은 배열에 할당된 데이터가 가로로 엑셀의 셀에 할당된다는 것이다.

위의 VBA 코드를 직접 실행해보는 방법은

Alt + F11 을 누르고 나서 [삽입] - [모듈] 을 선택하면 위와 같은 화면을 입력할 수 있는 창이 나온다.

VBA 코드를 복사하여 붙여넣기를 하거나 직접 입력해주고 나서 F5키를 누르면 결과가 엑셀화면에 보인다.

코드를 순차적으로 이해하고 싶다면 F8키를 한번씩 눌러주면 변화되는 과정을 살펴볼 수 있다.


이번에는 배열을 죽 나열하지 않고 한줄로 깔끔하게 표현하고 싶다면 어떻게 해야 할까?

array 를 이용하면 된다. 그런데 array 를 사용하려면 변수 선언을 Dim var as Variant 로 해줘야 한다.

Sub var_array2()

    Dim var As Variant   
    [A1].CurrentRegion.Clear    '// A1셀의 인접영역에 할당된 값을 전부 제거
    Range("A1:F100").Clear      '// A1:F100 영역에 할당된 값을 전부 제거   
    var = Array(1, 3, 9)
    Range("A1:E1") = var
    Cells(3, 1).Resize(, 3) = var
    Cells(4, 1).Resize(, UBound(var)) = var
    Cells(6, 1).Resize(, UBound(var) + 1) = var
   
    MsgBox "LBound는 " & LBound(var) & " UBound는 " & UBound(var)   
End Sub

배열이 1차원으로 가로로 저장된다는 것을 알았으니 아래와 같이 Cells(행,열) 즉 한 셀로부터 Resize 범위를 주고 값을 배열을 할당하면 어떻게 되는지 결과를 보면 다음과 같다.



var = Array(1,3,9) 는 var(0), var(1), var(2) 로 배열은 index 가 0 부터 시작된다.

MsgBox "LBound는 " & LBound(var) & " UBound는 " & UBound(var)  로 배열 하한값과 상한값을 확인할 수 있다.

Resize(,3) 은 Resize(1,3) 을 간략하게 표현한 것이다.

Resize(3) 은 Resize(3,1)을 간략하게 표현한 것이므로 Resize 값을 변경해보면 어떤 결과가 나오는지 직접 확인해보면 훨씬 이해가 빠르다.


배열 값이 가로로 뿌려지는데 세로로 뿌리고 싶다면 어떻게 하면 될까?

엑셀에서 기본적으로 제공하는 함수 transpose(var)를 이용해도 되고, For Next 구문을 이용해도 된다.

Sub var_array3()
    Dim var As Variant   
    [A1].CurrentRegion.Clear    '// A1셀의 인접영역에 할당된 값을 전부 제거
    Range("A1:F100").Clear      '// A1:F100 영역에 할당된 값을 전부 제거   
    var = Array(1, 3, 9)
    Cells(3, 1).Resize(3) = Application.Transpose(var)

    Cells(3, 3).Resize(3, 2) = Application.Transpose(var)   
End Sub


어떤 결과가 뿌려지는지 실행해보면 ....


엑셀에서 기본적으로 제공하는 함수를 VBA에서 활용할 때에는 application 을 앞에 붙여주면 된다.


아래는 Cells(행,열) 에서 행의 값이 변하면서 값이 할당되는데 For 문과 LBound, Ubound 를 활용하면 원하는 시작셀부터 값을 뿌릴 수 있다.

Sub var_array4()
    Dim var As Variant
    [A1].CurrentRegion.Clear    '// A1셀의 인접영역에 할당된 값을 전부 제거
    Range("A1:F100").Clear      '// A1:F100 영역에 할당된 값을 전부 제거
    var = Array(1, 3, 9)
    For n = LBound(var) To UBound(var)
        Cells(n + 1, 1) = var(n)
    Next n
End Sub



배열의 데이터를 셀에 뿌리는 걸 해봤다면 이제 거꾸로 셀에 있는 내용을 배열로 저장하는 걸 해보자.


블로그 이미지

Link2Me

,