VBA(Visual Basic for Applications)에서 상수 Const
선언 방법을 명확히 이해하면 코드 가독성과 유지보수성이 크게 향상된다. 본 글은 상수 선언의 원칙, 범위, 자료형 지정, 실무 적용 예시, 자주 묻는 질문을 총정리하여 엑셀 업무에 즉시 활용할 수 있도록 안내한다.
상수 선언의 필요성
변수와 달리 상수(Constant)는 실행 중 값이 변경되지 않는 식별자이다. 하드코딩된 숫자나 문자열을 상수로 치환하면 다음과 같은 효과를 얻는다.
- 코드 의미 전달력이 높아진다 ― ‘
VAT_RATE
’가 ‘0.1
’보다 직관적이다. - 오타나 계산 실수를 방지한다 ― 한곳에서 정의 후 참조만 한다.
- 유지보수가 용이하다 ― 값 변경 시 선언부만 수정한다.
- 컴파일 최적화가 적용되어 실행 속도가 소폭 향상된다.
Const 키워드 기본 사용법
가장 단순한 형태는 다음과 같다.
Const PI = 3.14159265358979
Const COMPANY_NAME = "WayFix"
1. 자료형 지정
명시적 자료형 선언은 타입 혼동을 예방한다.
Const MAX_COLUMN As Integer = 16384
Const EXCHANGE_RATE As Double = 1432.55
Const IS_FINAL As Boolean = True
자료형 | 설명 | 예시 |
---|---|---|
Byte, Integer, Long, LongLong | 정수형 상수 | Const RETRY As Byte = 3 |
Single, Double, Currency | 실수형 또는 통화 | Const RATE As Currency = 0.045 |
Boolean | 논리값 | Const IS_DEBUG As Boolean = False |
Date | 날짜/시간 | Const LAUNCH_DAY As Date = #2025-12-01# |
String | 문자열 | Const MSG As String = "처리 완료" |
Enum
)을 고려한다.2. 범위 지정
상수도 변수처럼 프로시저, 모듈, Public 단위로 범위를 지정할 수 있다.
선언 위치 | 접근 수식어 | 유효 범위 | 예시 |
---|---|---|---|
프로시저 내부 | (생략) | 해당 프로시저 한정 | Const TAX As Double = 0.1 |
모듈 최상단 | Private |
해당 모듈 전체 | Private Const PATH As String = "C:\Temp" |
표준 모듈 | Public |
프로젝트 전역 | Public Const APP_NAME As String = "ChemBoss" |
열거형(Enum)으로 상수 그룹화
관련 상수를 묶어 형식 안정성과 자동 완성(IntelliSense)을 도입할 수 있다.
Public Enum wbState
wbStateNew = 0
wbStateSaved = 1
wbStateReadonly = 2
End Enum
'사용 예
If ThisWorkbook.ReadOnly Then
currentStatus = wbStateReadonly
End If
조건부 컴파일 상수(#Const)
디버그·릴리스 빌드별 코드 분기를 넣어야 할 때 유용하다.
#Const IS_TEST = True
Sub RunJob()
#If IS_TEST Then
Debug.Print "테스트 모드 실행"
#Else
Call ProductionRun
#End If
End Sub
실무 예제: 단일 통화 환산 매크로
다음 예시는 프로젝트 전역 환율을 상수로 선언하고, 시트 범위 값을 모두 하나의 통화 단위로 환산한다.
Option Explicit
Public Const USD_KRW As Double = 1432.55
Public Const JPY_KRW As Double = 9.44
Sub ConvertToKRW()
Dim rng As Range
Dim curCode As String
Dim i As Long
Application.ScreenUpdating = False
Set rng = Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row) '통화코드
For i = 2 To rng.Rows.Count + 1
curCode = Cells(i, "B").Value
Select Case curCode
Case "USD": Cells(i, "C").Value = Cells(i, "A").Value * USD_KRW
Case "JPY": Cells(i, "C").Value = Cells(i, "A").Value * JPY_KRW
Case Else : Cells(i, "C").Value = Cells(i, "A").Value 'KRW
End Select
Next i
Application.ScreenUpdating = True
End Sub
상수 선언 시 주의사항
- 상수명은 영문·숫자·밑줄만 사용하고 첫 문자는 영문이어야 한다.
- 형변환 함수(
CLng
등)나 계산식을 포함할 수 없다 ― 오로지 리터럴만 허용한다. - 실수형 상수는
.
소수점 기호를 사용하며 지역 설정과 무관하게 컴파일된다. - 프로시저 수준에서 선언한 상수는
Static
키워드가 불가하다.
상수 관리 모범 사례
- Config 모듈을 만들어 모든 공통 상수를 중앙화한다.
- 업무 기준 값이 자주 바뀔 가능성이 있으면 상수 → 이름 정의(Name)로 전환하여 워크시트에서 관리한다.
- 원 단위·백만 단위처럼 계산 계수 Factoring 상수로 분리하여 가독성을 향상한다.
- 날짜 레퍼런스 상수는
#YYYY-MM-DD#
포맷으로 통일한다.
FAQ
Q1. Option Explicit를 선언했는데 Const를 생략해도 오류가 나지 않는다?
Option Explicit는 ‘선언되지 않은 변수 사용’을 막을 뿐, 숫자 리터럴 자체는 오류가 아니다. 하지만 유지보수를 위해 모든 매직넘버는 반드시 상수로 선언하는 것이 좋다.
Q2. Const 값에 워크시트 함수 결과를 넣을 수 있는가?
불가능하다. 상수는 컴파일 시점에 할당되므로, 런타임 계산 결과를 사용할 수 없다. 필요하다면 ReadOnly Property
방식으로 우회한다.
Q3. Public Const가 여러 모듈에서 중복 선언되면 어떻게 되나?
컴파일 오류가 발생한다. 동일 프로젝트 내에 상수명이 중복되면 안 되므로, 전역 상수는 전용 모듈 한 곳에만 선언한다.
Q4. 왜 Variant 상수는 허용되지 않는가?
Variant는 런타임에 실제 데이터 형이 결정되는 특수 자료형이므로, ‘불변’이라는 상수의 정의와 모순된다.
Q5. #Const로 선언한 조건부 상수는 코드에서 직접 참조할 수 있는가?
아니다. #Const DEBUG_MODE = True
와 같이 선언한 컴파일 상수는 #If ... #End If
전처리 블록 내부에서만 사용한다.
참고·출처
- Microsoft VBA Language Reference, 상수(Const) 항목
- Excel MVP 국제 포럼 ‘Best Practices for Constants’ 토론 스레드
- WayFix 내부 코딩 컨벤션 가이드라인 v2.3
'#4 VBA > #4.2 코딩문법' 카테고리의 다른 글
전역 변수와 지역 변수 차이 (7) | 2025.07.31 |
---|---|
Option Explicit와 변수 선언 강제 (4) | 2025.07.30 |
변수의 범위(Public, Private) (0) | 2025.07.29 |
변수를 선언하는 Dim 키워드 (0) | 2025.07.28 |
변수(Variable) 개념과 역할 (4) | 2025.07.27 |