[매크로] - 변수, IF문, 반복문, 자동 형변환

2026. 1. 8. 22:01RPA/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**을 붙여야 합니다. (가장 많이 하는 실수)

VBA
 
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")  ' (O) 올바른 표현
' ws = ThisWorkbook.Sheets("Sheet1")    ' (X) 에러 발생 (Set 누락)

3. 조건문 (IF / Select Case)

괄호 {} 없이 Then과 End ...로 블록을 잡습니다.

① IF 문

VBA
 
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 (다중 조건)

가독성이 좋아서 현업에서 상태값 체크할 때 많이 씁니다.

VBA
 
Select Case score
    Case 90 To 100
        MsgBox "최우수"
    Case Is >= 80
        MsgBox "우수"
    Case Else
        MsgBox "보통"
End Select

4. 반복문 (Loop)

① For ... Next (횟수 반복)

VBA
 
Dim i As Long
' 1부터 10까지 반복
For i = 1 To 10
    Cells(i, 1).Value = i  ' 1열 i행에 값 입력
Next i

② For Each ... Next (컬렉션 순회) - ★ 추천

엑셀의 Range(셀 범위)를 다룰 때는 이 방식이 더 직관적이고 빠릅니다.

VBA
 
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)

매크로가 돌 때 화면이 번쩍거리는 것을 막고 속도를 비약적으로 올립니다.

VBA
 
Sub FastMacro()
    ' [시작] 최적화 옵션 끄기
    Application.ScreenUpdating = False ' 화면 갱신 중지 (필수)
    Application.Calculation = xlCalculationManual ' 수식 자동 계산 중지 (선택)

    ' ... (여기에 무거운 작업 로직 작성) ...

    ' [끝] 옵션 원상복구
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

② 디버깅 (Debug.Print)

MsgBox로 확인하면 엔터 치느라 바쁩니다. 콘솔 창(직접 실행 창, Ctrl+G)에 로그를 찍으세요.

VBA
 
Debug.Print "현재 진행 행: " & i

③ 에러 처리 (On Error)

코드 중간에 에러가 나도 멈추지 않게 하거나, 에러 로그를 남길 때 씁니다.

VBA
 
On Error Resume Next  ' 에러가 나도 무시하고 다음 줄 실행해라 (주의해서 사용)
On Error GoTo ErrorHandler ' 에러 나면 점프해라

' ... 코드 ...

Exit Sub ' 정상 종료 시 여기서 끝냄

ErrorHandler:
    MsgBox "에러 발생: " & Err.Description
End Sub

이 정도 문법과 패턴이면 현업 엑셀 자동화 업무의 95% 이상은 커버 가능합니다.

 

 

 

 

 

형변환

 

[VBA] 문자열 "100"을 숫자로 알아서 바꿔서 넣음

 

1. Variant 타입의 자동 형변환

만약 변수 선언 시 타입을 지정하지 않으면(Dim a) 자동으로 Variant 타입이 되는데, 얘는 카멜레온처럼 매번 바뀝니다.

VBA
 
Dim a ' As Variant 생략됨

a = 10      ' 현재 타입: Integer
a = "Hello" ' 현재 타입: String (에러 안 남, 타입이 바뀜)
a = 3.14    ' 현재 타입: Double

개발자 Note: 편해 보이지만 메모리를 많이 먹고 속도가 느립니다. 또한, 의도치 않은 버그의 주범이므로 백엔드 개발자라면 사용을 지양해야 합니다.

 

주의! 연산자 + 의 함정

자2. 동 형변환 때문에 발생하는 VBA 특유의 모호함이 있습니다.

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