2026. 1. 8. 22:01ㆍRPA/VBA
변수
VBA 그 자체의 문법 구조와 현업 실무 패턴에 집중해서 설명해 드리겠습니다.
1. 선언문 해부: Dim userName As String
이 한 줄은 컴파일러에게 **"메모리를 이렇게 확보해라"**라고 지시하는 명령어입니다.
- Dim (키워드): Dimension의 약어. **"변수를 선언하겠다"**는 신호입니다.
- userName (식별자): 변수의 이름입니다.
- As (지정자): 변수명과 데이터 타입을 연결해 주는 접착제 역할입니다.
- String (데이터 타입): 변수에 담을 그릇의 종류입니다.
[약어(Type Declaration Character) 참고] VBA에는 As String을 생략하고 변수명 뒤에 특수기호를 붙여 타입을 지정하는 고전적인 약어가 있습니다. 옛날 코드를 보실 때 필요할 수 있습니다.
- Dim name$ → Dim name As String
- Dim count& → Dim count As Long
- Dim num% → Dim num As Integer
- 현업 권장: 가독성을 위해 약어 대신 As String처럼 명시적으로 쓰는 것이 표준입니다.
2. 변수 (Variables) - 실무 핵심
현업에서 가장 많이 쓰는 타입과 주의할 점입니다.
① 자주 쓰는 데이터 타입
- Long (정수): 무조건 Integer 대신 Long을 쓰세요.
- Integer는 32,767까지만 저장되는데, 엑셀 행은 100만 개가 넘어서 오버플로우가 자주 터집니다. 메모리 절약 효과도 없으니 그냥 Long이 답입니다.
- String (문자열): 텍스트 저장.
- Double (실수): 소수점이 있는 숫자.
- Variant (만능): 타입을 확정할 수 없을 때 씁니다. (배열을 통째로 담을 때 유용하지만, 남발하면 느려집니다.)
② 객체 변수 할당 (Set)
Range, Worksheet, Workbook 같은 **객체(Object)**를 변수에 담을 때는 반드시 앞에 **Set**을 붙여야 합니다. (가장 많이 하는 실수)
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1") ' (O) 올바른 표현
' ws = ThisWorkbook.Sheets("Sheet1") ' (X) 에러 발생 (Set 누락)
3. 조건문 (IF / Select Case)
괄호 {} 없이 Then과 End ...로 블록을 잡습니다.
① IF 문
Dim score As Long
score = 85
If score >= 90 Then
MsgBox "A등급"
ElseIf score >= 80 Then
MsgBox "B등급"
Else
MsgBox "C등급"
End If
- 논리 연산자: 기호(&&, ||)가 아니라 영어 단어 **And, Or, Not**을 씁니다.
② Select Case (다중 조건)
가독성이 좋아서 현업에서 상태값 체크할 때 많이 씁니다.
Select Case score
Case 90 To 100
MsgBox "최우수"
Case Is >= 80
MsgBox "우수"
Case Else
MsgBox "보통"
End Select
4. 반복문 (Loop)
① For ... Next (횟수 반복)
Dim i As Long
' 1부터 10까지 반복
For i = 1 To 10
Cells(i, 1).Value = i ' 1열 i행에 값 입력
Next i
② For Each ... Next (컬렉션 순회) - ★ 추천
엑셀의 Range(셀 범위)를 다룰 때는 이 방식이 더 직관적이고 빠릅니다.
Dim rng As Range
Dim c As Range
Set rng = Range("A1:A10")
For Each c In rng ' rng 범위 안의 셀(c) 하나하나를 꺼냄
If c.Value = "Target" Then c.Interior.Color = vbYellow
Next c
5. 현업 개발자의 "필수 패턴" (Boilerplate)
VBA 코드를 짤 때 성능과 안정성을 위해 거의 무조건 넣는 코드 블록입니다.
① 속도 향상 3대장 (ScreenUpdating)
매크로가 돌 때 화면이 번쩍거리는 것을 막고 속도를 비약적으로 올립니다.
Sub FastMacro()
' [시작] 최적화 옵션 끄기
Application.ScreenUpdating = False ' 화면 갱신 중지 (필수)
Application.Calculation = xlCalculationManual ' 수식 자동 계산 중지 (선택)
' ... (여기에 무거운 작업 로직 작성) ...
' [끝] 옵션 원상복구
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
② 디버깅 (Debug.Print)
MsgBox로 확인하면 엔터 치느라 바쁩니다. 콘솔 창(직접 실행 창, Ctrl+G)에 로그를 찍으세요.
Debug.Print "현재 진행 행: " & i
③ 에러 처리 (On Error)
코드 중간에 에러가 나도 멈추지 않게 하거나, 에러 로그를 남길 때 씁니다.
On Error Resume Next ' 에러가 나도 무시하고 다음 줄 실행해라 (주의해서 사용)
On Error GoTo ErrorHandler ' 에러 나면 점프해라
' ... 코드 ...
Exit Sub ' 정상 종료 시 여기서 끝냄
ErrorHandler:
MsgBox "에러 발생: " & Err.Description
End Sub
이 정도 문법과 패턴이면 현업 엑셀 자동화 업무의 95% 이상은 커버 가능합니다.
형변환
[VBA] 문자열 "100"을 숫자로 알아서 바꿔서 넣음
1. Variant 타입의 자동 형변환
만약 변수 선언 시 타입을 지정하지 않으면(Dim a) 자동으로 Variant 타입이 되는데, 얘는 카멜레온처럼 매번 바뀝니다.
Dim a ' As Variant 생략됨
a = 10 ' 현재 타입: Integer
a = "Hello" ' 현재 타입: String (에러 안 남, 타입이 바뀜)
a = 3.14 ' 현재 타입: Double
개발자 Note: 편해 보이지만 메모리를 많이 먹고 속도가 느립니다. 또한, 의도치 않은 버그의 주범이므로 백엔드 개발자라면 사용을 지양해야 합니다.
주의! 연산자 + 의 함정
자2. 동 형변환 때문에 발생하는 VBA 특유의 모호함이 있습니다.
Dim a, b
a = "10"
b = "20"
' 문자열끼리 더하면?
Debug.Print a + b
' 결과는 "1020"일 수도 있고, 상황에 따라 30이 될 수도 있습니다. (위험!)
[해결책] 문자열 연결은 무조건 & 연산자를 쓰세요.
- + : 숫자 더하기 (애매함)
- & : 문자열 연결 (확실함, Java의 문자열 +와 같음)
- "10" & "20" → "1020" (무조건 문자열 결합)
요약: VBA는 자동 형변환이 너무 잘 돼서 오히려 위험한 언어입니다. 입력받은 데이터를 처리할 때는 CLng(), CStr() 등을 써서 명시적으로 타입을 변환해 주는 것이 안전한 알고리즘을 짜는 비결입니다.
실습
Sub MarkEvenNumbersRed()
Dim i As Long
' [성능 최적화] 화면 갱신을 잠시 꺼둡니다 (속도 향상)
Application.ScreenUpdating = False
' 1부터 50까지 반복
For i = 1 To 50
' Cells(행, 열) -> i행 1열 (A열)
' With 문을 써서 Cells(i, 1) 객체를 반복 참조하지 않게 합니다.
With Cells(i, 1)
' 1. 값 입력 (A1=1, A2=2 ...)
.Value = i
' 2. 조건 검사: 2로 나누어 떨어지면 (짝수면)
If i Mod 2 = 0 Then
.Interior.Color = vbRed ' 배경색: 빨강
.Font.Color = vbYellow ' (선택) 글자색: 빨강 배경엔 노랑이 잘 보임
.Font.Bold = True ' (선택) 굵게
Else
' 홀수일 때는 색 없음 (재실행 시 기존 색 지우기 위해 필요)
.Interior.Color = xlNone
.Font.Color = vbBlack
.Font.Bold = False
End If
End With
Next i
' 화면 갱신 복구
Application.ScreenUpdating = True
MsgBox "완료되었습니다!"
End Sub

'RPA > VBA' 카테고리의 다른 글
| [VBA] - 모듈안에 여러 프로시저(매크로), Sub, Function, Property (0) | 2026.01.08 |
|---|