Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

VBA

[VBA 입문] 11강. 실행 순서 제어(1) ㅡ 조건 분기

권현욱(엑셀러) 2023. 10. 4. 08:00
반응형

들어가며

VBA로 작성한 코드는 위에서부터 아래로 내려가면서 차례대로 실행됩니다. 이런 방식을 '인터프리터(interpreter)' 방식이라고 합니다. 요즘 인기 있는 프로그래밍 언어인 파이썬(Python)도 이 방식을 따릅니다.

상황에 따라서는 순차적 실행에서 벗어나야 하는 경우가 있는데 이것을 '실행 순서 제어 구문'(줄여서 '제어 구문')이라고 합니다. 제어 구문을 이해하면 코딩 실력은 한 단계 도약합니다. 기대되시죠? 출발합니다.


제어 구문의 종류

살다 보면 뭔가를 계속 반복해야 하는 경우도 있고 조건에 따라 절차와 순서가 나뉘기도 합니다. 프로그래밍에서도 마찬가지입니다. 순차적인 실행에서 벗어나기 위해 VBA에서 사용할 수 있는 수단은 아래와 같이 구분할 수 있습니다.

구분 종류 용도
조건 분기 If 처리할 조건 수가 적을 때
Select ~ Case 처리할 조건 수가 많을 때
반복 For ~ Next 반복할 횟수를 알고 있을 때
Do ~ Loop 반복할 횟수를 알 수 없을 때
이동 GoTo 프로그램 실행 도중 지정한 위치로 이동할 때

'용도'는 필자가 구분해 본 것으로, 절대적인 기준은 아닙니다.


If 문

엑셀 워크시트 함수 중에 If가 있습니다. 조건 분기 처리를 할 때 사용하며 활용 빈도가 높습니다. VBA에도 If가 있으며 비슷한 용도로 사용합니다. 일반적인 사용 형식은 이렇습니다.

If 조건식 Then
    명령문
End If

'조건식'이 참인 경우에만 '명령문'을 실행합니다. End If를 생략하여 아래와 같이 축약 형태로 사용할 수도 있습니다만, 당분간은 일반적인 형식을 사용할 것을 추천합니다.

If 조건식 Then 명령문

조건식, 조건 분기 처리라고 하니까 생소하신가요? 조금만 생각해보면 일상생활에서도 흔히 벌이지는 일입니다. 전혀 생소하지 않습니다.

조건식(만약 ~ 라면) 참인 경우 거짓인 경우
비가 올 것 같으면 우산을 챙긴다 우산을 두고 간다
지각할 것 같으면 택시를 탄다 버스를 탄다
점심을 먹었으면 커피를 마신다 밥을 먹는다

 조건을 분석하고 그 결과에 따라 특정한 행동을 하는 것은 프로그래밍의 본질이라고 할 수 있습니다. 다음 코드를 실행하면 현재 시간이 오전/오후 여부에 따라 다른 메시지 상자가 표시됩니다.

Sub if_then()
    If Time >= 0.5 Then
        MsgBox "Good Afternoon!"
    Else
        MsgBox "Good Morning!"
    End If
End Sub

If Time >= 0.5라는 것은 현재 컴퓨터에 설정된 시간이 정오보다 큰 지 여부를 조건 비교하는 과정입니다. 0.5 이상이면 오후이므로 'Good Afternoon!', 그렇지 않으면 'Good Morning!'이라는 문자열을 메시지 상자에 표시합니다.

만약 조건이 여러 개라면 ElseIf를 여러 번 사용하여 다음과 같이 표현합니다. 언뜻 보면 다소 무시무시해 보이지만 하나하나 뜯어보면 그렇게 외계어는 아님을 알 수 있습니다.

컴퓨터는 하루 24시간을 0과 1 사이의 일련 번호 형태로 인식합니다. 0은 자정, 0.25는 오전 6시, 0.5는 정오, 0.75는 오후 6시라는 점을 이해하고 있으면 됩니다. Time은 현재 PC에 설정되어 있는 시간을 알려주는 함수입니다.

Sub if_then_else()
    If Time < 0.5 Then
        MsgBox "Good Morning!"
    ElseIf Time >= 0.5 And Time < 0.75 Then
        MsgBox "Good Afternoon!"
    ElseIf Time >= 0.75 And Time < 0.9 Then
        MsgBox "Good Evening!"
    Else
        MsgBox "Good Night!"
    End If
End Sub

조건의 수가 많아지면 If 문은 구조적으로 복잡해집니다. 그런 경우에는 다음에 소개할 Select ~ Case 문을 사용하면 편리합니다.


Select ~ Case 문

Select ~ Case 문의 일반적인 형태는 다음과 같으며, [  ] 부분은 생략할 수 있습니다.

Select Case 조건식
    Case 값1
        조건식이 값1에 해당되는 경우 수행할 작업
    [Case 값2]
        [조건식이 값2에 해당되는 경우 수행할 작업]
    [Case 값3]
        [조건식이 값3에 해당되는 경우 수행할 작업]
    ......
    [Case Else]
        [모든 조건이 False일 경우 수행할 작업]
End Select

앞에서 작성한 'if_then_else' 프로시저를 Select ~ Case 문으로 바꿔보면 이렇게 됩니다.

Sub select_case()
    Dim sMsg As String
    
    Select Case Time
        Case Is < 0.5
            sMsg = "Good Morining!"
        Case 0.5 To 0.75
            sMsg = "Good Afternoon!"
        Case 0.76 To 0.9
            sMsg = "Good Evening!"
        Case Else
            sMsg = "Good Night!"
    End Select
    
    MsgBox sMsg
End Sub

If 문으로 했을 때보다 한결 구조화되었고 보기에도 편해졌습니다. 읽기에 편할 뿐 아니라 관리하기도 쉽습니다. 새로운 조건을 추가하려면 Case만 추가하면 됩니다.

Select ~ Case 문은 위에서부터 차례로 실행하다가 True 상황이 오면 빠져나갑니다. 따라서 발생 가능성이 가장 높은 조건을 맨 처음으로 배치하면 실행 속도가 조금 더 빨라질 수 있습니다.

나가며

컴퓨터란 '조건을 판단하고 그에 맞는 작업을 (반복) 처리하는 머신(machine)'에 다름 아닙니다. 다만 그 과정을 엄청한 속도로 수행하죠. 여러분은 이제 그중 하나인 조건 분기 처리를 이해하게 되었습니다. 축하합니다.