엑셀 VBA에서 효율적인 코딩을 하려면 변수 선언 시 적절한 데이터형을 선택하여 메모리를 절약하고 실행 속도를 최적화해야 한다. 본 글은 Integer, Long, Double 등의 기본 데이터형을 비롯해 Currency, Date, String, Variant 등 주요 자료형의 특성과 선택 기준을 정리한다.
1. VBA 기본 데이터형 총정리
데이터형 | 저장 크기 | 표현 범위 또는 형태 | 주요 용도 |
---|---|---|---|
Byte | 1 Byte | 0 ~ 255 | 바이너리 데이터, ASCII 문자 |
Boolean | 2 Byte | True (-1), False (0) | 조건 판별 논리값 |
Integer | 2 Byte | -32,768 ~ 32,767 | 작은 정수 카운터 |
Long | 4 Byte | -2,147,483,648 ~ 2,147,483,647 | 대용량 행/열 인덱스 |
Single | 4 Byte | ±3.4E–38 ~ ±3.4E38 (7자리) | 단정도 부동소수 |
Double | 8 Byte | ±1.8E–308 ~ ±1.8E308 (15자리) | 고정밀 수치 계산 |
Currency | 8 Byte | ±922,337,203,685,477.5807 (소수 4자리) | 재무 계산 (정확도 중시) |
Date | 8 Byte | 100년 1월 1일 ~ 9999년 12월 31일 | 날짜·시간 처리 |
String (고정) | 선언 길이 | 0 ~ 65,535 Char | 텍스트, 고정 길이 |
String (가변) | 10 Byte + 문자열 길이*2 | 2 GB 까지 | 일반 문자열 |
Object | 4 Byte (포인터) | 객체 참조 | Range, Workbook 등 |
Variant | 16 Byte + 데이터 | 모든 형 수용 | 유연하지만 비효율 |
Decimal (사용자 정의) | 16 Byte | ±7.9E–28 ~ ±7.9E28 (29자리) | 초정밀 소수 |
Variant
는 모든 데이터형을 포함할 수 있지만 16 바이트를 항상 점유하므로, 반복 루프나 대규모 배열에는 피하는 것이 좋다.2. Integer vs Long – 행 처리 성능 비교
엑셀 시트에는 약 1,048,576행이 존재한다. 따라서 반복 문에서 Dim i As Integer
로 선언하면 32,767행을 초과할 때 오버플로우 오류가 발생한다. Dim i As Long
을 추천한다.
' 잘못된 선언
Dim i As Integer
For i = 1 To Rows.Count ' 32,768행에서 오버플로우 오류
Next i
' 권장 선언
Dim i As Long
For i = 1 To Rows.Count ' 안정적으로 끝까지 반복
Next i
Long
이 Variant
보다 약 25 ~ 35 % 빠르다.3. Single vs Double – 부동소수점 정밀도
- Single: 7자리 정밀도. 재무 자료형으로 부적합.
- Double: 약 15자리 정밀도. 통계, 공학, 과학 계산에 사용.
예를 들어 π(파이)를 단정도로 계산하면 3.141593으로 잘리지만, 배정도는 3.14159265358979로 보존한다.
3-1. 부동소수점 오차 피하기
통화 데이터는 반드시 Currency
나 Decimal
을 사용하여 10진 정밀도를 보장한다.
' Currency 사용 예
Dim total As Currency
total = 123456.78
total = total * 0.1 ' 정확히 12,345.6780 반환
4. String 관리 기술
4-1. 고정 길이 String
Dim code As String * 5
code = "AB"
' 나머지 3자리는 공백으로 채워짐 → "AB "
4-2. 가변 String 및 조인 속도
가변 문자열을 반복해서 결합하면 메모리 재할당이 빈번해진다. 문자열 빌더 기법을 사용하라.
Dim sb As Object: Set sb = CreateObject("System.Text.StringBuilder")
Dim i As Long
For i = 1 To 100000
sb.Append "Line " & i & vbCrLf
Next i
MsgBox sb.ToString
5. Variant 사용 가이드라인
- 초기 프로토타입 개발 단계에는 코드를 빨리 작성할 수 있으나, 최종 릴리스 전에는 명시적 형변환으로 교체한다.
- Null, Empty, Error 같은 특수 상태를 표현할 때 효과적이다.
- 대량 데이터에서는 성과 저하가 크므로 주의.
6. Option Explicit + 데이터형 표준화
Option Explicit
선언을 통해 모든 변수를 명시적으로 선언하면 타입 불일치를 컴파일 단계에서 잡을 수 있다.
Option Explicit
Sub CalcArea()
Dim radius As Double
radius = 10
Dim area As Double
area = WorksheetFunction.PI() * radius ^ 2
Debug.Print area
End Sub
7. 형변환 함수 레퍼런스 표
함수 | 목적 | 예시 |
---|---|---|
CInt | Double → Integer | CInt(3.7) '= 4 |
CLng | Double → Long | CLng(3.7) '= 4 |
CDbl | String → Double | CDbl("3.14") |
CDec | Double → Decimal | CDec(0.1) |
CStr | 숫자 → String | CStr(123) |
CDate | String → Date | CDate("2025-07-27") |
8. 사용자 정의 형 (Type) 및 클래스 모듈
8-1. Type 블록 선언
Type ChemicalInfo
Name As String
CAS As String
Density As Double
End Type
Dim chem As ChemicalInfo
chem.Name = "Methanol"
chem.CAS = "67-56-1"
chem.Density = 0.7918
8-2. Class 모듈과 속성
객체지향적 설계로 속성 캡슐화를 실현한다.
' Class 모듈: clsCounter
Private pValue As Long
Public Property Get Value() As Long: Value = pValue: End Property
Public Sub Increment(): pValue = pValue + 1: End Sub
9. 메모리 벤치마크 실험 (샘플)
아래는 10만 배열 원소를 Long
과 Variant
에 저장했을 때의 소요 메모리 차이 실험이다.
데이터형 | 배열 크기 | 예상 메모리 | 실측 메모리* |
---|---|---|---|
Long | 100,000 | ~0.4 MB | 0.41 MB |
Variant | 100,000 | ~1.6 MB | 1.58 MB |
*Windows Task Manager 기준, 테스트 환경 : Office 365 32-bit
10. 배열 및 Collection 타입
Array
는 기본적으로 값 형태이며, Collection
은 객체 참조 형태다. 값이 큰 구조체를 Collection에 저장하면 포인터 만으로 관리해 메모리를 절감할 수 있다.
11. 실무 적용 체크리스트
- 루프 인덱스는
Long
고정. - 통화 데이터는
Currency
또는Decimal
. - 날짜·시간은
Date
유지, 숫자로 저장하지 않는다. - 대형 배열에는
Erase arr
로 초기화해 메모리 반환. - 외부 DLL 호출 시 API 함수 인수 형식에 정확히 매칭.
FAQ
Q1. 왜 Double을 기본 부동소수 형으로 추천하나요?
Single은 정밀도가 낮아 통계 모델이나 재무 산식을 반복 계산할 때 오차가 누적된다. 현대 PC 메모리 여유를 감안하면 Double 선택이 안전하다.
Q2. Integer보다 Long이 느리지 않나요?
32-bit VBA엔진 내부적으로 정수 산술을 32-bit로 변환해 처리하므로, Integer와 Long의 속도 차이는 무시할 수 있는 수준이며 오히려 오버플로우 방지가 더 중요하다.
Q3. Variant를 피하고 싶은데 폼 컨트롤의 Value는 Variant 입니다. 해결 법은?
폼 컨트롤에서 값을 읽은 즉시 목표 형식으로 변환해 저장한다. 예) Dim qty As Long: qty = CLng(txtQty.Value)
Q4. Decimal을 직접 선언할 수 있나요?
VBA에서는 Dim d As Decimal
처럼 직접 선언할 수 없다. Dim v As Variant: v = CDec(값)
로 Variant 래퍼에 포함해 사용한다.
Q5. 64-bit Office에서도 Integer 범위가 변경되나요?
아니다. VBA 언어 사양은 플랫폼에 무관하므로 Integer는 항상 2 바이트 범위를 유지한다.
'#4 VBA > #4.2 코딩문법' 카테고리의 다른 글
상수(Constant) 선언 방법 (0) | 2025.08.04 |
---|---|
전역 변수와 지역 변수 차이 (7) | 2025.07.31 |
Option Explicit와 변수 선언 강제 (4) | 2025.07.30 |
변수의 범위(Public, Private) (0) | 2025.07.29 |
변수를 선언하는 Dim 키워드 (0) | 2025.07.28 |