VBA 코드 예시로 돌아가기

VBA – 배열 변수 선언(Dim), 생성 및 초기화하기

이 튜토리얼에서는 VBA에서 배열 변수를 선언(Dim), 생성 및 초기화하는 방법을 보여드립니다.

VBA 배열 변수는 무엇인가요?

VBA 배열 변수는 동일한 이름으로 저장되면서 동일한 데이터 유형을 가진 변수 그룹으로 생각할 수 있습니다. 배열에는 텍스트, 숫자 또는 객체를 저장할 수 있습니다.

배열의 요소는 인덱스 번호를 사용하여 참조합니다.

다른 변수를 선언할 때와 동일한 방식으로 Dim, Static, Public 또는 Private 키워드를 사용하여 배열 변수를 선언할 수 있습니다.

일반 배열

배열에는 일반 배열과 동적 배열의 두 가지 유형이 있습니다. 일반 배열은 처음 배열을 선언할 때 크기가 지정된 상태로 선언됩니다. 고정 배열이라고도 합니다.

Dim intA(4) as integer

위의 배열은 프로시저모듈에서 Dim 문을 사용하여 선언한 것으로, 배열의 LBound 값을 선언하지 않았기 때문에 배열의 크기는 5입니다.

오타가 아닙니다! 4를 입력했음에도 불구하고 배열 크기는 5입니다. 배열 인덱스는 자동으로 0에서 시작하기 때문입니다.

배열 인덱스

배열 인덱스는 코드 모듈의 맨 위에 Option Base 1을 선언하지 않는 한 자동으로 0에서 시작합니다.

vba option base

Option Base 1을 선언하면 배열은 자동으로 1에서 시작합니다.

하지만 이런 방식으로 변수를 선언하는 것은 문제가 있습니다. 코드를 검토하는 사람은 배열이 0에서 시작한다는 사실이나 Option Base 1 선언을 인지하지 못할 수 있습니다.

대신 저는 배열의 시작과 끝 위치를 명시적으로 선언하는 것을 선호합니다:

Dim intA(2 to 5) as integer

이렇게 하면 1이나 0뿐만 아니라 어떤 숫자에서든 배열을 시작할 수 있습니다.

동적 배열

동적 배열 변수는 코드가 실행되는 동안 크기를 변경할 수 있는 배열입니다. 동적 변수를 선언할 때에는 크기를 지정하지 않습니다.

Dim intA() as integer

배열이 생성된 후 ReDim 문을 사용하여 배열의 크기를 지정할 수 있습니다.

ReDim intA(2)

동적 배열의 크기는 언제든지 조정할 수 있습니다. 그러나 ReDim 문을 사용하면 기존 값이 모두 지워집니다. 기존 배열 값을 보존하려면 대신 ReDim Preserve를 사용하십시오.

ReDim Preserve intA(2)

프로시저, 모듈 또는 전역 수준에서 동적 배열을 선언할 수 있지만, ReDim 문은 프로시저 내에서만 사용할 수 있습니다.

Variant 배열

Variant 배열은 작업하기 쉬운 동적 배열입니다.

Dim varNames()

데이터 유형(기본값은 Variant)이나 배열 크기를 지정할 필요가 없다는 점에 주목하세요.

아래에서 볼 수 있듯이 Array 함수를 사용하여 Variant 배열을 초기화할 수 있습니다(배열 크기를 먼저 조정할 필요 없음)!

모듈 이나 전역 수준에서 배열 변수 정의하기

위와 같이 프로시저 내에서 배열을 선언하여 해당 프로시저 내에서 사용할 수 있습니다:

Sub StaticArray()
'LBound 값이 1이고 UBound 값이 4인 배열을 선언합니다.
   Dim IntA(1 to 4) as Integer
End Sub

모듈이나 전역 수준에서도 배열 변수를 선언할 수 있습니다.

Option Explicit

'LBound 값이 1이고 UBound 값이 4인 배열을 선언합니다.
Dim IntA(1 to 4) as Integer

Sub StaticArray()
End Sub

이 예제에서 배열 변수는 이 코드 모듈 내 어디에서나 호출할 수 있습니다. VBA 프로젝트 전체에서 사용할 수 있는 공용 배열을 선언할 수도 있습니다(다음 섹션을 참조해 주세요).

공용배열(Public Array) 선언하기

전역 변수(Public Variable)을 선언하는 것과 비슷한 방법으로 일반 배열을 전역변수로 선언할 수 있습니다.

Public strNames(3) as String

이 선언은 모듈의 맨 위, Option Explicit 아래에 위치해야 합니다. 그러면 VBA 프로젝트의 모든 모듈이나 프로시저에서 사용할 수 있습니다.

모듈의 맨 위에 Array를 선언하되 Dim 키워드를 사용하면 해당 배열의 사용이 해당 개별 모듈로 제한됩니다. 다른 모듈에서 배열을 사용하려고 하면 오류가 발생합니다.

배열 초기화하기

다음과 같은 방법으로 일반 배열에 값을 할당할 수 있습니다.

Sub StaticArray() 
'LBound 값 1, UBound 값 4로 배열을 선언합니다. 
  Dim IntA(1 to 4) as Integer 
'배열의 초기값을 지정합니다
  IntA(1) = 10 
  IntA(2) = 20 
  IntA(3) = 30 
  IntA(4) = 40 
'배열의 위치 2의 결과를 직접실행 창에 표시합니다.
   Debug.Print IntA(2) 
End Sub

위의 프로시저를 실행하면 20이라는 값이 직접실행 창에 표시됩니다.

같은 방식으로 동적 배열에 값을 할당할 수도 있습니다.

Sub DynamicArray() 
'동적 배열을 크기는 생략하고 선언합니다
   Dim IntA() as Integer 
'배열의 초기값을 지정합니다
   ReDim IntA(1 to 4)
   IntA(1) = 10 
   IntA(2) = 20 
   IntA(3) = 30 
   IntA(4) = 40 
'배열의 위치 2의 결과를 직접실행 창에 표시합니다. 
  Debug.Print 
  IntA(2) 
End Sub

Array 함수

Variant 배열에서는, 위에서 설명한 표준적인 방법으로 배열을 만드는 것보다 더 쉽게 Array 함수를 사용하여 배열을 만들 수 있습니다.

'배열을 생성합니다
    intA() = Array(10, 20, 30, 40)

반복문을 사용하여 배열 만들기

Excel에서 셀 범위를 반복하여 배열을 만들 수도 있습니다.

Sub TestDynamicArrayFromExcel()
'배열을 선언합니다
   Dim strNames() As String
'범위에서 행 개수를 계산하기 위한 변수를 선언합니다
   Dim n As Integer
'반복문에서 사용할 변수를 선언합니다
   Dim i As Integer
'범위에서 행의 개수를 계산합니다
   n = Range("A1", Range("A1").End(xlDown)).Rows.Count
'범위의 행의 개수에 따라 배열의 크기를 재정의합니다
   ReDim strNames(n)
   For i = 0 To n
      strNames(i) = Range("A1").Offset(i + 1, 0)
   Next i
'배열의 값을 표시합니다
   MsgBox Join(strNames())
End Sub

배열의 값 다시 입력하기

코드의 어느 단계에서든 배열의 값을 다시 입력할 수 있지만, 그러면 배열의 해당 위치에 포함된 원래 값을 잃게 됩니다.

Sub StaticArray() 
'LBound 값이 1이고 UBound 값이 4인 배열을 선언합니다. 
   Dim IntA(1 to 4) as Integer 
'배열의 초기값을 입력합니다
   IntA(1) = 10 
   IntA(2) = 20 
   IntA(3) = 30 
   IntA(4) = 40 
'2번 인덱스에 위치한 값을 직접실행 창에 표시합니다
   Debug.Print IntA(2)
'배열의 값을 다시 입력합니다
   intA(2)= 200
   Debug.Print IntA(2)
 End Sub

위의 예제에서 Static 배열은 2번 인덱스의 값을 제외한 모든 값을 유지하며, 2번 인덱스의 값은 200으로 변경됩니다.

ReDim 사용하기

동적 배열을 사용하는 경우 ReDim 문은 배열의 크기를 설정하는 데 사용됩니다. 코드의 어느 위치에서도 ReDim 문을 사용하여 필요한 만큼 배열의 크기를 변경할 수 있습니다. 아래 코드는 intA 배열을 크기가 2가 되도록 다시 초기화합니다(기억하세요 – 배열 인덱스는 0에서 시작합니다!).

ReDim intA(1) as Integer

아래의  ReDim 문을 사용한 코드 예제를 참고해 주세요.

Sub TestDynamicArray()
'배열을 선언합니다
   Dim intA() As Integer
   ReDim intA(2)
'배열 값을 숫자로 채워줍니다
   intA(0) = 2
   intA(1) = 5
   intA(2) = 9
'1번인덱스의 값을 표시합니다
   Debug.Print intA(1)
'배열의 크기를 바꿔서 재정의 합니다
   ReDim intA(3)
   intA(0) = 6
   intA(1) = 8
'1번 인덱스의 값을 표시합니다
   Debug.Print intA(1)
End Sub

위의 프로시저를 실행하면 직접실행 창에 5가 표시되고, ReDim을 사용하여 배열의 크기와 값을 조정한 후에는 8이 표시됩니다. 그러나 IntA(2)를 새로 선언하지 않았고 않았고 ReDim Preserve 를 사용하지도 않았으므로 배열에서 해당 위치의 값이 제거되고 인덱스 2와 3의 값은 모두 0이 됩니다.

ReDim Preserve 사용하기

ReDim Preserve를 사용하면 배열에 포함된 원래 값은 유지합니다.

Sub TestDynamicArray() 
'배열을 선언합니다
   Dim intA() As Integer 
   ReDim intA(2) 
'배열의 값을 숫자로 채웁니다
   intA(0) = 2
   intA(1) = 5
   intA(2) = 9 
'2번 인덱스의 값을 표시합니다
   Debug.Print intA(2) 
'배열을 다시 선언합니다
   ReDim Preserve intA(3) 
   intA(0) = 6 
   intA(1) = 8 
'2번 인덱스의 값을 다시 표시합니다
  Debug.Print intA(2) 
End Sub

위에 코드 실행으로 인해 직접 실행창에 표시된 두 값은 모두 9입니다. 이는 ReDim Preserve 문이 해당 값을 해당 위치에서 유지했기 때문입니다.

 

vba-free-addin

VBA 코드 예시 추가 기능

본 웹사이트에 있는 모든 코드 예시에 쉽게 접근해보세요.

메뉴로 이동하여 클릭만 하면 코드는 모듈에 바로 입력됩니다. .xlam 추가 기능.

(설치가 필요 없습니다!)

무료 다운로드

VBA 코드 예시로 돌아가기