이미 VB/VBA 천자문(千字文)을 뗀 사람들은 아실 테지만 배열중에는 엿장수의 마음처럼 그 크기를
늘리거나 줄일 수 있는 동적배열이 있습니다. 동적배열의 기본적인 사용법은 VBA 도움말에
다음과 같이 볼 수 있습니다.
Option Base는
1이라고 간주됩니다.
Dim MyArray() As Integer ' 동적 배열을 선언합니다.
Redim MyArray(5) ' 5개의 요소를 할당합니다.
For I = 1 To 5 ' 5번 반복합니다.
MyArray(I) = I ' 배열을 초기화합니다.
Next I
다음 문은 배열의 크기를
바꾸고 그 요소들을 삭제합니다.
Redim MyArray(10) ' 10개의 요소로 크기를 변경합니다.
For I = 1 To 10 ' 10번 반복합니다.
MyArray(I) = I ' 배열을 초기화합니다.
Next I
다음 문은 배열의 크기를
바꾸지만 그 요소들을 삭제하지 않습니다.
Redim Preserve MyArray(15) ' 15개의 요소로 크기를 변경합니다.
위의 예와 같이 동적배열을 선언 시 그 크기를 미리 지정하지 않다가
사용 전에 ReDim문을 사용하여 그 크기를 지정하게 됩니다. 또한 데이터를 보관하면서
크기를 변경하려는 경우 Preserve문을 부가하여 사용하게 됩니다.
그러나 종종 크기를 지정하지 않고 사용하는 경우 아래 첨자
사용이 잘못되었습니다라는 다음과 같은 메시지 상자를 만나게 됩니다.

동적배열 사용시 이러한
불상사를 방지하기 위한 방법이 필요합니다. 다음은 이번
데일리 팁의 요점에 해당하는 코드입니다.
Sub demo_DynamicArray()
Dim arr() As String
Dim bln As Boolean
Dim i As LongOn Error Resume Next
i = LBound(arr)
bln = Not (Err.Number = 9)
On Error GoTo 0
MsgBox bln
End Sub |
프로그램의 앞부분에서 arr()이라는 String형 동적배열을 선언하였습니다.
그리고 LBound()함수를 사용하여 배열의 하위 인덱스값을 얻으려고 합니다.
이때 ReDim문 없이 사용했다면 배열은 크기가 정해져 있지 않으므로 아래
첨자 사용이 잘못되었습니다 라는 런타임에러가 발생합니다.
이 에러는 번호가 9번으로 다음 행의 Err.Number=9 식을 통해 확인됩니다.
그리고 식은 True가 되지만 우리의 편의상 배열이 준비되어 있지 않다는 의미로 False로 바꾸어
표시하는 것이 좋으므로 Not 연산자를 사용하여 반대로 표시하도록 합니다.
만일 중간에 i = LBound(arr) 행 이전에 ReDim arr(1)이라는
코드를 넣게 되면 하위 인덱스 번호로 0이 돌려주게 됩니다. 따라서 최종 결과는 True가 됩니다.
즉 배열이 준비되어 있다는 의미가 됩니다.
그러나 ReDim arr(1) 선언후 Erase문으로 배열을 지우게 되면 다시
배열은 준비가 안된 상태가 되어 결과는 False가 됩니다.
다음의 코드는 ReDim과 Erase문을 사용한 예입니다.
Sub demo_DynamicArray()
Dim arr() As String
Dim bln As Boolean
Dim i As LongReDim arr(1)
Erase arr
On Error Resume Next
i = LBound(arr)
bln = Not (Err.Number = 9)
On Error GoTo 0
MsgBox bln
End Sub |
|