반복문 안에서 배열을 채웠다 비웠다 하는 매크로를 짜다 보면, 다음 회차로 넘어가기 전에 배열을 깨끗이 비워야 할 때가 있습니다. 이때 쓰는 게 Erase 문입니다. 이름만 보면 "지운다"는 하나의 동작 같지만, 배열이 고정 크기냐 동적이냐에 따라 하는 일이 꽤 다릅니다.

Sub program1472()
    Dim V As Variant '// Variant 변수 선언
    ReDim V(1 To 1) '// Variant 변수 사용
    Erase V '// Variant 변수 초기화
End Sub

Variant 로 선언한 변수에 ReDim 으로 배열을 만든 다음 Erase 로 비우는 예입니다. 이렇게 ReDim 으로 만든 배열은 동적 배열이라, Erase 를 하면 요소 값만 지우는 게 아니라 배열이 쓰던 메모리 자체를 돌려줍니다. 그래서 그 뒤에 다시 쓰려면 ReDim 으로 크기를 다시 잡아야 하고, 그 전에 V(1) 처럼 접근하면 "첨자 사용이 잘못되었습니다" 오류가 납니다.

고정 크기 배열은 값만 초기화된다

Dim A(1 To 10) As Long 처럼 처음부터 크기를 정한 배열은 Erase 해도 크기가 그대로 남습니다. 메모리를 해제하지 않고 각 요소를 기본값으로 되돌릴 뿐입니다. 어떤 값으로 돌아가는지는 배열 형식에 따라 다릅니다.

배열 형식 Erase 후 각 요소의 값
숫자 배열 0
가변 길이 문자열 배열 길이가 0인 문자열("")
고정 길이 문자열 배열 0
Variant 배열 Empty
사용자 정의 형식 배열 각 멤버를 개별 변수처럼 초기화
개체 배열 Nothing

고정 크기 배열은 Erase 직후에도 UBound 가 원래 값을 돌려주고 바로 다시 값을 넣을 수 있습니다. 반복할 때마다 같은 크기의 배열을 재사용한다면 이쪽이 편합니다.

문법과 자주 쓰는 형태

Erase arraylist

arraylist 는 비울 배열 변수 이름이고, 쉼표로 여러 개를 한꺼번에 줄 수 있습니다. Erase A, B, C 처럼요.

실무에서 헷갈리는 지점

동적 배열을 비우는 목적이라면 Erase 대신 ReDim V(1 To 새크기) 를 바로 해도 됩니다. ReDim 은 Preserve 를 붙이지 않으면 기존 내용을 버리고 새로 만들기 때문에 결과는 같습니다. Erase 가 특히 쓸모 있는 건 "이 배열을 다 썼으니 메모리를 돌려주고 싶다"거나 "배열이 비어 있는 상태로 되돌리고 싶다"는 경우입니다. 큰 시트 데이터를 Range.Value 로 통째로 받아 둔 배열을 다 쓴 뒤 Erase 해 두면, 같은 프로시저 안에서 뒤쪽 작업이 길게 이어질 때 메모리를 조금이라도 아낄 수 있습니다.

비어 있는 동적 배열은 UBound 를 호출하는 순간 오류가 나기 때문에, 배열이 비었는지 확인하는 함수를 만들 때는 On Error Resume Next 로 UBound 를 감싸 오류 번호를 보는 방식을 많이 씁니다. Erase 다음에 바로 For i = 1 To UBound(V) 같은 코드가 이어지지 않는지도 한 번 확인해 보세요.

참고: Erase 문 - Microsoft Learn