본문 바로가기
excel VBA

엑셀 VBA 배열 사용법

by 퍼포먼스마케팅코더 2023. 8. 30.
반응형

배열 사용

배열은 동일한 데이터 형식을 여러 개 사용하는 변수이다. 배열은 저장 공간이 여러 개인 단일 변수인 반면 일반 변수는 값 저장 공간이 하나이다. 배열에서 참조는 저장된 변수 값을 가져오는 것을 말한다. 배열은 전체 또는 각 요소 (element)들을 참조할 수도 있다. 요소는 배열 변수에 선언한 데이터 형식이 동일한 각각에 대한 값이다. 다음은 배열 사용법이다.

Dim varname(subscripts) [ As type]
Dim varname(start To end) [As type]

첫 번째는 변수 사용법과 동일하다. 추가로 subscripts는 배열의 요소 갯수이다. 요소 개수는 subscripts + 1이고 요소 번호(index)는 0부터 subscripts까지다. 두 번째는 배열의 요소 번호가 start에서 end로 요소 갯수는 end - start + 1 이다.

예를 들어, 매일 하루 경비를 저장할 때 365개 변수 선언보다 365개 요소를 가지는 배열 변수 한 개 선언이 효율적이다. 배열은 각 요소마다 값이 한 개 있다. 다음 문은 365개 요소로 된 배열 변수 curExpense를 선언한다. 기본적으로 배열의 요소번호는 0에서 시작하므로 배열의 요소 상한값은 365가 아닌 364이다.

Dim curExpense(364) As Currency

배열에서 요소의 값은 요소 번호로 구분하여 배정한다. 4 줄과 6 줄은 For 문 으로 0에서 364까지 365회 반복하였다. 5 줄는 365개 각 배열 요소에 모두 20 을 배정하였다.

Sub FillArray()
   Dim curExpense(364) As Currency
   Dim intI As Integer
   For intI = 0 to 364
      curExpense(intI) = 20
   Next
End Sub

하한값 변경

배열에서 시작 인덱스를 변경하면 작업이 편리한 경우가 있다. 이것이 필요하면 모듈의 맨 위에 Option Base 문을 사용하여 첫 번째 요소의 기본 인덱스를 0에서 특정한 값으로 변경한다. 다음 예에서 1 줄은 Option Base 문으로 첫 번째 요소번호를 1로 설정하였다. 2 줄은 Dim 문은 요소가 365개인 배열 변수 curExpense를 선언하였다.

Option Base 1
Dim curExpense(365) As Currency

또한 To를 사용하여 배열 요소번호를 명시적으로 설정할 수 있다. 다음 예는 To로 배열 요소번호 하한값을 명확하게 설정하였다. 1 줄은 요소번호 범위를 1에서 365, 2 줄은 7에서 13까지 설정하였다.

Dim curExpense(1 To 365) As Currency
Dim strWeekday(7 To 13) As String

배열에 값 저장

배열을 생성하고 각 요소에 값을 배정하는 방법은 두 가지가 있다. 첫 번째는 각 배열 요소에 선언한 데이터 형식을 각각 입력한다. 다음 보기는 배열요소에 값을 각각 저장한다.

Dim varData(3) As Variant
varData(0) = "Claudia Bendel"
varData(1) = "4242 Maple Blvd"
varData(2) = 38
varData(3) = Format("06-09-1952", "일반 날짜")

두 번째는 Array 함수로 Variant 변수에 값을 배정한다.

Dim varData As Variant
varData = Array("Ron Bendel", "4242 Maple Blvd", 38, _
Format("06-09-1952", "General Date"))

어떤 방법으로 변수를 만들어도 Variant 배열 요소에 값은 동일하게 저장된다. 위에서 소개한 두 예가 같은지 다음 문을 추가하고 결과가 같은지 확인하자.

MsgBox "Data for " & varData(0) & " has been recorded."

다차원 배열 사용

지금까지 소개한 배열은 일차원 배열이다. 2차원 이상 배열을 다차원 배열이 라고 한다. 배열은 60 차원까지 선언할 수 있다. 다음 보기는 요소가 5 × 10

개인 2 차원 배열이다. 즉 다차원 배열 선언은 요소 갯수를 컴마로 구분하여 입력한다.

Dim sngMulti(1 To 5, 1 To 10) As Single

2 차원 배열을 행렬로 표현하면 첫 번째 인수는 행을 나타내고 두 번째 인수는 열을 나타낸다. 다차원 배열에 값 배정은 For-Next 문을 여러 개 겹쳐 사용한다. 다음 예는 2 차원 배열 요소에 Single 값을 채운다.

Sub FillArrayMulti()
   Dim intI As Integer, intJ As Integer
   Dim sngMulti(1 To 5, 1 To 10) As Single
   For intI = 1 To 5
      For intJ = 1 To 10
         sngMulti(intI, intJ) = intI * intJ
         Cells(intI, intJ) = sngMulti(intI, intJ)
      Next intJ
   Next intI
End Sub

3 줄은 5 × 10 개 2 차원 배열을 선언한다. 5 에서 10 줄은 각 요소에 값을 배정한다. 8 줄은 저장된 배열 요소 값을 현재 시트 (1,1)에서 (5,10) 셀에 출 력한다.

동적 배열 선언

지금까지 배열은 처음에 선언하면 배열 요소의 갯수 변경을 할 수 없었다. 동적 배열 선언은 코드가 실행하는 동안 배열의 크기를 정하고 변경도 가능하다. 다음 보기는 Dim 키워드 사용하여 요소 크기가 없는 동적 배열을 선언한다. 빈 배열 생성은 괄호 안을 공백으로 남겨둔다.

Dim sngArray() As Single

ReDim 문은 임의로 배열 요소 크기를 선언한다. ReDim 문은 이미 선언한 배열을 다시 사용해도 되고 새로운 배열을 선언할 수 있다. 그렇기 때문에 이미 있는 배열을 다시 선언한다면 배열 이름을 잘못 쓰지 않도록 주의 한다. ReDim 문은 차원의 수를 변경하거나 요소의 수를 정의하고 각 차원의 상한값과 하한값을 정의한다. 다음 보기에서 오류가 발생하는 곳을 찾아보자.

Sub ArrayTest()
   Dim i() As Integer
   Dim j(5) As Integer
   Dim m(2 To 5) As Integer
   ReDim i(11) As Integer
   ReDim j(2 To 6) As Integer
   ReDim m(2 To 10) As Integer
   ReDim n(2 To 10) As Integer
End Sub

동적 배열 다시 선언하면 배열에 있는 기존 값은 잃게 된다. 따라서 배열의 기존 값을 보존하고 배열을 확장하려면 ReDim Preserve를 사용한다. 다음 예는 원래 요소의 현재값을 잃지 않고 배열 varArray를 10 요소만큼 확장한다.

ReDim Preserve varArray(UBound(varArray) + 10)

Preserve 키워드는 동적 배열과 함께 사용하면 마지막 차원의 상한값만 변경할 수 있지만 차원의 수는 변경할 수 없다

반응형

'excel VBA' 카테고리의 다른 글

Sub 프로시저  (0) 2023.08.30
엑셀 vba 제어문  (0) 2023.08.30
엑셀 VBA 문장 작성  (0) 2023.08.30
엑셀 변수와 상수  (0) 2023.08.30
엑셀 배열함수와 배열수식 기초 및 사용법  (0) 2023.08.30

댓글