엑셀 VBA 개발자는 변수를 명확하게 선언하여 코드 오류를 예방하고 성능을 최적화해야 한다. 본 포스팅은 Dim
키워드의 동작 원리, 데이터형 지정 방법, 범위‧수명 관리, 실무 활용 팁을 체계적으로 정리하여 현업에서 즉시 적용할 수 있도록 안내한다.
Dim 키워드란 무엇인가
Dim
(Dimension)은 VBA에서 변수를 선언할 때 사용하는 핵심 키워드이다. 메모리에 변수를 위한 공간을 예약하고, 컴파일러에게 해당 이름이 변수임을 알린다. 명시적 선언을 통해 가독성과 디버깅 효율을 높일 수 있다.
암묵적 선언과 명시적 선언 비교
구분 | 선언 방법 | 장점 | 단점 |
---|---|---|---|
암묵적 | Option Explicit 미사용, 변수명만 사용 | 코드 입력이 빠르다 | 오타로 인한 런타임 오류, Variant 남용 |
명시적(권장) | Option Explicit + Dim |
타이핑 실수 방지, 메모리 절약, 실행 속도 향상 | 초기 학습 부담 |
데이터형별 메모리 사용량과 범위
데이터형 | 바이트 | 값 범위 | 예시 |
---|---|---|---|
Byte | 1 | 0~255 | Dim b As Byte |
Integer | 2 | -32,768~32,767 | Dim i As Integer |
Long | 4 | 약 ±21억 | Dim l As Long |
Single | 4 | ±3.4E38 | Dim s As Single |
Double | 8 | ±1.8E308 | Dim d As Double |
Currency | 8 | -9,223,372,036,854.7758~동일 양수 | Dim c As Currency |
String(고정) | 선언 길이 | 선언 길이 | Dim sName As String * 20 |
String(가변) | 10 + 길이×2 | 약 20억 문자 | Dim sTxt As String |
Boolean | 2 | True/False | Dim flag As Boolean |
Date | 8 | 100~9999년 12월 31일 | Dim dt As Date |
Variant | 16+ | 모든 데이터형 | Dim v As Variant |
Option Explicit와 Dim
Option Explicit
문을 모듈 상단에 선언하면 모든 변수를 Dim
, Static
, Private
, Public
등으로 명시해야 한다. 이는 오타를 컴파일 타임에 발견하게 하여 품질을 높인다.
범위(스코프)와 수명(라이프사이클)
- 프로시저 수준 :
Dim
을 프로시저 내부에 선언하면 해당 프로시저가 끝나면 메모리에서 해제된다. - 모듈 수준 : 프로시저 밖, 모듈 상단에 선언하면 모듈 어디서나 사용 가능하다.
- 전역 수준 :
Public
키워드를 사용해 프로젝트 전체에서 접근한다. - Static : 프로시저 종료 후에도 값이 유지된다.
배열 선언과 Dim
배열은 데이터를 연속적으로 저장할 때 사용한다. 정적 배열과 동적 배열 두 방식이 있다.
'정적 배열
Dim arr(1 To 12) As Double
'동적 배열
Dim arrDynamic() As String
ReDim arrDynamic(1 To 100)
객체 변수 선언
Excel 객체, Dictionary, Collection 등은 Set
구문과 함께 사용된다.
Dim wb As Workbook
Set wb = ThisWorkbook
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
초기화 및 기본값
VBA는 변수를 선언하더라도 초기값을 명시하지 않으면 기본값을 할당한다. 예) 숫자는 0, String은 빈 문자열, Boolean은 False
등이다.
가독성과 유지보수 팁
- 목적에 맞는 데이터형을 사용하여 메모리 낭비를 방지한다.
- 접두사 규칙(예:
rngSales
,lngTotal
)로 의미를 명확히 한다. - 모듈 상단에
Option Explicit
를 넣어 안전망을 구축한다. - 관련 변수를 블록으로 묶어 주석 처리하여 구조를 한눈에 파악한다.
오류 예방 사례 연구
Variant
남용으로 속도가 지연되었다. Dim rngSales As Range
, Dim lngTotal As Long
로 형을 명확히 하자 처리 시간이 45초 → 3초로 단축되었다.Dim 선언 체크리스트
# | 항목 | 확인 내용 |
---|---|---|
1 | Option Explicit 사용 | 모든 모듈 상단에 선언했는가 |
2 | 적절한 데이터형 | Long vs Integer, Double vs Currency 등 비교 |
3 | 스코프 최소화 | 필요 이상으로 전역 변수를 쓰지 않는가 |
4 | 배열 범위 | ReDim Preserve 시 메모리 관리 |
5 | 객체 해제 | Set obj = Nothing 으로 참조 해제 |
실무 예시: 월별 보고서 자동화 매크로
Sub MakeMonthlyReport()
Option Explicit '컴파일 시 오타 예방
Dim wsSrc As Worksheet '데이터 원본
Dim wsRep As Worksheet '보고서 시트
Dim rngData As Range
Dim dMonth As Date, iRow As Long
Set wsSrc = ThisWorkbook.Sheets("RAW")
Set wsRep = ThisWorkbook.Sheets("REPORT")
dMonth = DateSerial(Year(Date), Month(Date), 1)
Set rngData = wsSrc.Range("A1").CurrentRegion
Dim dictSum As Object
Set dictSum = CreateObject("Scripting.Dictionary")
For iRow = 2 To rngData.Rows.Count
Dim sDept As String
Dim curAmt As Currency
sDept = CStr(rngData.Cells(iRow, 2).Value)
curAmt = CCur(rngData.Cells(iRow, 5).Value)
If dictSum.Exists(sDept) Then
dictSum(sDept) = dictSum(sDept) + curAmt
Else
dictSum(sDept) = curAmt
End If
Next iRow
'보고서 출력
Dim iOut As Long: iOut = 2
Dim vKey
For Each vKey In dictSum.Keys
wsRep.Cells(iOut, 1).Value = dMonth
wsRep.Cells(iOut, 2).Value = vKey
wsRep.Cells(iOut, 3).Value = dictSum(vKey)
iOut = iOut + 1
Next vKey
End Sub
FAQ
Q. Variant와 Dim을 함께 쓰면 어떤 문제가 발생하나?
A. Variant는 가변 길이 타입으로 처리 시간이 늘어나고, 암묵적 형 변환으로 의도치 않은 결과가 발생한다.
Q. Static과 Dim의 차이는 무엇인가?
A. Static 변수는 프로시저 종료 후에도 값이 보존되지만, Dim 변수는 프로시저 종료 시 메모리에서 해제된다.
Q. Public Dim과 Global Dim의 차이는?
A. VBA7부터는 Global 키워드가 지원되지 않으며 Public으로 대체되었다. 두 키워드는 기능적으로 동일하지만 Public을 권장한다.
Q. 배열 상수를 Dim으로 선언할 수 있나?
A. VBA는 배열 상수 직접 선언을 지원하지 않는다. Array()
함수를 사용하거나, Variant형 배열에 할당해야 한다.
Q. 객체 변수를 Private Dim으로 선언하면 다른 모듈에서 접근 가능한가?
A. 아니다. Private 스코프는 동일 모듈 내에서만 접근 가능하다.
'#4 VBA > #4.2 코딩문법' 카테고리의 다른 글
변수(Variable) 개념과 역할 (3) | 2025.07.27 |
---|