TOP

VBA-수업 13.2. 배열 사용(Arrays)(계속)

YouLibreCalc for Excel logo

둘 이상의 데이터 열을 저장하려면 배열의 다른 차원이 필요합니다. 예:

2차원 배열에 데이터 저장:

 '선언
 Dim array_example(10, 2) '11 x 3 "정의된" 배열

 '배열에 데이터 저장
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

다음은 이러한 값을 사용하는 몇 가지 예입니다.

MsgBox array_example(0, 0)  '=> 반환 날짜: 2026년 11월 3일
MsgBox array_example(0, 1)  '=> 반환: 24
MsgBox array_example(9, 2)  '=> 반환: NO
MsgBox array_example(10, 2) '=> 반환: YES

동적 배열

정기적으로 배열의 데이터를 업데이트해야 하므로 선언 시 고정된 값을 할당할 수 없다고 잠시 상상해 보겠습니다.

비어 있지 않은 마지막 셀, 즉 데이터베이스의 마지막 행의 행 번호를 찾으려면 다음 공식을 사용합니다.

last_row = Range("A1").End(xlDown).Row

Excel은 선언에 변수를 허용하지 않습니다.

대신 동적 배열(빈 괄호 사용)을 선언한 다음 Redim을 사용하여 크기를 정의하세요.

Dim array_example()
ReDim array_example(last_row - 2, 2)

다음 절차를 사용하면 데이터 세트(테이블)의 모든 행을 배열에 저장할 수 있습니다.

Dim array_example()
ReDim array_example(last_row - 2, 2)

유바운드

이전 예에서 배열의 마지막 숫자는 last_row - 2였습니다.

For i = 0 To last_row - 2

배열의 마지막 숫자를 확인하는 또 다른 방법은 Ubound를 사용하는 것입니다.

For i = 0 To UBound(array_example)

이 함수는 선택한 차원(기본값은 첫 번째 차원)에 대해 배열에서 가장 큰 숫자를 반환합니다.

이를 더욱 명확하게 해주는 몇 가지 예는 다음과 같습니다.

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> 반환 : 10
     MsgBox UBound(array_example, 1) '=> 반환 : 10
     MsgBox UBound(array_example, 2) '=> 반환 : 2
End Sub

배열 요소 범위에 데이터 저장

루프를 사용하지 않고도 워크시트의 셀 범위 값으로 배열을 채울 수 있습니다.

 '선언
 Dim array_example(10, 2) '11 x 3 "정의된" 배열

 '배열에 데이터 저장
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

앞의 코드는 다음과 같이 효과적으로 대체될 수 있습니다.

 '선언
 Dim array_example()

 '배열에 데이터 저장
 array_example = Range("A2:C12").Value

두 번째 방법이 첫 번째 방법보다 더 매력적으로 보이지만 대부분의 경우 첫 번째 방법보다 구현하는 데 더 많은 시간이 소요될 수 있습니다.

이런 식으로 배열에 데이터를 저장하면 첫 번째 숫자가 0이 아닌 1이 되어 혼동을 일으킬 수 있습니다.

나중에 코드를 늘리는 과정에서 특정 검색 기준을 충족하는 데이터만 배열에 저장하기로 결정했다면(또는 전혀 다른 작업을 수행하기로 결정했다면) 다른 루프 기능을 사용하여 코드를 완전히 다시 작성해야 하는데...

그러나 이 두 번째 방법은 루프보다 빠르기 때문에 대규모 데이터 세트의 전체 내용을 저장해야 하는 경우 매우 유용합니다(15,000개의 레코드마다 약 0.2초 절약).

배열(Array)

그러나 "고정된" 내용이 있는 배열을 생성해야 하는 경우에는 다음과 같습니다.

한 가지 해결책은 테이프별로 값을 기록하는 것입니다.

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"

다행히 배열(Array)을 사용하여 이 코드를 단순화할 수 있습니다.

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

다음은 Replace 함수 사용에 대한 데모입니다(다음 예를 이해하는 데 도움이 됩니다).

Sub replace_example()
     Dim var_translate As String

     '이 예의 텍스트 리본
     var_translate = "Hello World !"
     
     '텍스트 리본에서 "World"를 "you"로 바꿉니다.
     var_translate = Replace(var_translate, "World", "you")

     '교체 후 테이프
     MsgBox var_translate '=> "안녕하세요!"를 반환합니다.
End Sub

이제 일련의 값을 다른 데이터 세트로 바꾸려면 배열과 Array 함수를 사용하는 것이 매우 유용합니다.

Sub translate() '수식을 영어에서 프랑스어로 번역하는 간단한 예
     Dim var_translate As String

     '이 예의 텍스트 리본
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     '두 가지 값 세트
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
     fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
     
     '"SI"를 "IF"로, "RECHERVEV"를 "VLOOKUP"으로 바꾸세요.
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     '교체 후 테이프
     MsgBox var_translate '=> "Formula 번역: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))"을 반환합니다.
End Sub

텍스트를 배열로 변환(VBA Split)

Split 함수를 사용하면 문자열을 여러 부분으로 나누고 결과 값을 배열에 쓸 수 있습니다.

리본을 배열로 변환하려면 다음을 수행하십시오.

variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"

VBA 함수 Split를 사용하고 구분 기호를 지정합니다.

en = Split(variable, "/")

"en" 배열은 다음 값을 반환합니다.

MsgBox en(0) '=> 반환: IF
MsgBox en(1) '=> 반환: VLOOKUP
MsgBox en(2) '=> 반환 : SUM
MsgBox en(3) '=> 반환: COUNT
MsgBox en(4) '=> 반환: ISNUMBER
MsgBox en(5) '=> 반환: MID

다음 3개 배열도 동일한 값을 반환합니다.

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

다음 예에서는 문자열의 세 번째 값을 반환합니다.

MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> 반환 : SUM

Split의 반대는 VBA 함수 Join입니다.

이 함수는 배열의 값을 문자열로 수집합니다.

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> 반환 : 12345