TOP

VBA-강의 13.1. 배열 사용(Arrays)

배열(Arrays)은 Excel VBA을 포함하여 프로그래밍에서 매우 자주 사용됩니다.

배열은 본질적으로 값을 저장할 많은 셀이 있는 단일 변수인 반면, 일반적인 변수에는 하나의 값만 저장할 수 있는 저장 셀이 하나만 있습니다.

배열에 포함된 모든 값을 참조하려는 경우 배열 전체에 액세스할 수 있으며, 개별 요소를 참조할 수도 있습니다.

동일한 데이터 유형의 값 집합을 사용하도록 배열을 선언할 수 있습니다. 이 내용은 VBA-Lesson 6.2에서 이미 다루었습니다. Datatypes 이제 더 자세히 살펴보겠습니다.

배열은 왜 사용되나요?

최대 500개의 값을 저장해야 하는 프로시저를 작성하려고 한다고 가정해 보십시오. 500개의 별도의 변수를 만들어야 한다면 매우 어려울 것입니다. 배열 중간에 이러한 값을 저장하고 작업하는 것이 훨씬 쉬워집니다.

배열을 사용하는 두 번째 이유는 속도입니다. 배열에서 데이터를 읽는 데는 Excel 워크시트의 테이블(셀로 구성)에서 읽는 것보다 훨씬 적은 시간이 걸립니다.


배열 사용의 예

따라서 여기에 Excel에서 VBA 배열을 사용하는 것의 확실한 이점을 보여주는 예가 있습니다.

첫 번째 워크시트("DS")에는 5000행 x 3열의 데이터 세트가 있습니다.

두 번째 시트에는 연도 및 고객별 모든 "예" 답변("YES")을 고려한 요약 테이블이 있습니다.

이 경우 프로시저는 루프를 사용하여 데이터 세트를 처리하고 각 연도 및 각 고객 번호에 대한 "예" 응답 수를 기록한 다음 해당 데이터를 해당 셀에 입력합니다.

배열을 사용하지 않으면 이 절차를 실행하는 데 Excel 131.44초가 걸립니다.

그러나 먼저 데이터를 배열("DS" 워크시트의)에 저장한 다음 동일한 계산("DS" 워크시트 데이터세트 대신 배열 사용)을 수행하는 데는 1.74초밖에 걸리지 않습니다.

"YES" 응답을 포함하는 데이터만 배열에 저장하여 프로시저를 최적화하기로 결정한 경우(전체 데이터의 약 3/4) 소요되는 시간은 1.02초입니다.

이는 배열을 사용하여 절차를 128배 더 빠르게 수행할 수 있는 방법을 보여주는 좋은 예입니다. 동시에 많은 데이터 세트로 작업하면 최적화 결과가 더욱 좋아질 것입니다.

우리는 수업이 끝나면 예제의 세부 사항으로 돌아갈 것입니다.

배열 선언

다음은 VBA에서 배열을 선언하는 몇 가지 예입니다(처음 두 예가 명확하지 않은 경우 읽기).

 '1차원 배열 선언의 예
 Dim array1(4)

 '2차원 배열 선언의 예
 Dim array2(6, 1)

 '동적 배열 선언의 예
 Dim array3()

배열을 선언할 때 고정된 값을 입력할 수 없는 경우(예: 데이터세트의 크기에 따라 달라지기 때문에) 괄호를 비워 두세요.

데이터 유형(string, long 등)을 선언할 필요는 없지만 많은 경우 프로시저 실행 속도가 느려집니다.

배열의 데이터 저장

일부 데이터를 배열에 저장해 보겠습니다.

이 경우 11x1 값을 저장하려고 하므로 1차원 배열을 만들어야 합니다.

 '선언
 Dim array_example(10)

배열의 요소 번호 지정은 0으로 시작한다는 점을 잊지 마십시오. 이는 프로그래밍의 표준이므로 즉시 이 습관을 들이는 것이 좋습니다. 실제로 이 접근 방식은 VBA에서 변경할 수 있습니다.

이제 배열의 각 요소는 해당 값을 받습니다.

 '배열에 값 저장
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

마치 일반 변수인 것처럼 각 배열 요소를 조작하거나 수정할 수 있습니다.

다음은 array_example(8)을 사용하는 예입니다:

Sub example()
     '선언
     Dim array_example(10)
     
     '배열에 값 저장
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     '테스트 1
     MsgBox array_example(8) '=> 반환일 : 2016년 4월 2일
    
     '값 중 하나 변경
     array_example(8) = Year(array_example(8))
     
     '테스트 2
     MsgBox array_example(8) '=> 반환 날짜: 2016
End Sub

For 루프는 배열을 더 빠르게 저장하는 더 나은 옵션입니다.

 '선언
 Dim array_example(10)

 '배열에 값 저장
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next