티스토리 뷰

반응형

 

 

VBA에서 배열을 크기를 미리 정하지 않고, 흐름에 따라서 배열 크기를 증가시키면서 사용하는 것을 동적 배열이라 하고, 이

때 redim preserve를 사용하게 된다.

 

일반적인 사용법을 찾아보면, redim preserve는 일차원 배열에 대해서만 사용가능하다고 나와있어, 다차원 배열을 사용하고자 할때는 어려움이 있었다.

 

좀 더 내용을 찾아보니, 배열에 배열을 저장하는 방식으로 사용하면, 다차원 배열처럼 사용할 수 있음을 알게 되었다.

 

일반적인 다차원 배열 저장방식
Sub test_array()

Dim aTemp(), aTemp1(), aTemp2()

Dim atest

ReDim aTemp2(2, 1)

aTemp2(0, 0) = "a"
aTemp2(0, 1) = 1
aTemp2(1, 0) = "b"
aTemp2(1, 1) = 1
aTemp2(2, 0) = "c"
aTemp2(2, 1) = 1

' 일반적인 2차원 배열의 주소
debug.print aTemp(1, 1)


End Sub

 

배열에 배열을 저장하는 방식
Sub test_array()

Dim aTemp(), aTemp1(), aTemp2()

Dim atest

ReDim aTemp1(2)
aTemp1(0) = "aaA"
aTemp1(1) = "bbbB"
aTemp1(2) = aTemp2

' 배열에 배열을 저장'
ReDim aTemp(1)
aTemp(0) = aTemp1
aTemp(1) = aTemp1

' 배열의 주소는 (1,2)가 아닌, (1)(2) 가 된다.'
debug.print aTemp(1)(2)

End Sub

 

또한, for 문이나 do 문과 같은 반복문 안에서 배열이 초기화되었는지를 판단할 때,

 

Not Not Array를 사용하여 판단할 수 있다.

' 동적배열 선언'
Dim aTemp()

Debug.Print Not Not aTemp	' Not Not aTemp의 값은 0이 출력됨'

' 배열의 크기가 선언되었을 때,'
redmi aTemp(0)

Debug.Print Not Not aTemp	' Not Not aTemp의 값은 0이 아닌 값이 출력됨'

 

 

동적 배열 초기화여부 판단하는 또다른 방법

 

Sub test()

Dim aTemp()

ReDim aTemp(0)

Debug.Print (IsEmpty(aTemp(0)))		' atemp(0)의 하위 데이터가 없으므로 true 출력 '


' 임시데이터 생성  '
Dim attt(2)

attt(0) = 1
attt(1) = 2
attt(2) = 3

' 임시데이터를 동적배열에 할당  '
aTemp(0) = attt

' 2차원 배열의 세부데이터 유무 검토 '
Debug.Print (IsEmpty(aTemp(0)))		' atemp(0)의 하위 데이터가 있으므로 False 출력'


End Sub

 

 

 

 

 

 

 

댓글