- 최초 작성일: 2000-05-25
- 최종 수정일: 2026-09-30
- 조회수: 17 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 실행순서제어하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
보통 VBA 프로시저를 실행하면 맨 위 라인부터 시작해서 밑으로 한라인씩 내려가면서 실행이 됩니다. 매크로 기록 기능을 사용해서 작성한 코드를 보면 바로 이런 방식으로 작성되고 실행이 되는 것입니다. 그렇지만 경우에 따라서는 이러한 순차적인 실행에서 벗어나 특정 위치의 것을 먼저 실행하고 위의 것이 나중에 실행되기도 합니다.
이처럼 프로시저의 실행순서를 제어, 즉 바꾸는 방법에는 아래와 같은 형태가 있습니다.
- GoTo 문
- If ~ Then 구문
- Select Case 구문
- For ~ Next 구문
- Do While 반복 구문
- Do Until 반복 구문
실행순서제어하기
핵심 요약: 실행순서 제어
기본적으로 위에서 아래로 실행되는 프로시저의 흐름을 GoTo, If ~ Then, Select Case로 바꿀 수 있으며, 조건이 3개를 넘으면 Select Case가 권장됩니다.
- GoTo: 지정한 위치로 곧바로 이동하며, 주로 에러 트래핑에 사용합니다.
- If ~ Then: 조건에 따라 다른 문장을 실행합니다.
- Select Case: 조건이 많을 때 읽기 쉽게 처리합니다.
Step 1: GoTo 문
프로그램 내에서 실행순서를 바꾸는 가장 직접적인 방법이 GoTo 문을 사용하는 것입니다.
Sub GoToDemo()
Dim UserName As String
UserName = InputBox("귀하의 이름을 입력하세요", "//Exceller")
If Len(UserName) = 0 Then GoTo mm
MsgBox UserName & "님 환영합니다!!!"
Exit Sub
mm:
MsgBox "아무 것도 입력하지 않으셨군요...", , "//Exceller"
End Sub
위의 예에서 보듯이 "GoTo 위치"라고 해 주면 하늘이 두쪽나도 "위치"로 가서 그 이후의 문장을 실행합니다. 그런데 이 GoTo 문은 옛날 DOS 시절에 사용하던 BASIC(Visual Basic 말고…)에서 사용하던 제어구조입니다. 이 구문은 달리 쓰지 않을 도리가 없을 때에 한해서 사용하는 것이 좋습니다. 여기서 쓸 수 밖에 없는 경우라는 것은 제 경험에 의하면 에러 트래핑(error trapping), 즉 에러가 발생할 경우에 대비하여 어떤 검문소를 하나 설치하는 경우 정도일 것입니다. 그 정도로 잘 사용을 하지 않습니다. 융통성이 별로 없기 때문이지요.
Step 2: If ~ Then 구문
아마도 VBA에서 가장 빈번하게 사용되는 명령 중의 하나가 If ~ Then 구문이 아닌가 생각됩니다. 엑셀에서 함수를 공부하실 때에도 다중 If() 함수를 많이 사용하셨을 것입니다.
Sub IfThen()
If Time >= 0.5 Then
MsgBox "Good Afternoon!!!"
Else
MsgBox "Good Morning!!!"
End If
End Sub
If [조건식] Then [참일 경우] [Else 거짓인 경우]
이것이 If ~ Then 구문의 가장 전형적인 형태일 것입니다.
컴퓨터라는 것은 모든 것을 0과 1의 조합으로 받아들입니다. 문자열은 물론이고 날짜나 시간인 경우에도 이것을 숫자로 받아들이는 것입니다. 날짜에 있어서 1이라고 하면 컴퓨터(IBM 기종)는 1900년 1월 1일로 받아들이게 됩니다. 또한 시간에 있어서도 1이라고 하면 자정을 의미합니다. 즉 0이면 자정을, 0.5이면 정오를, 0.25이면 오전 6시, 0.75이면 오후 6시를 의미하는 것이지요.
따라서 위 프로시저에서 Time >= 0.5라는 것은 현재 시간이 정오보다 크냐 작으냐를 묻는 것이 되겠지요? 그래서 0.5보다 크면 "Good Afternoon!!!"이라는 문자열을, 그렇지 않으면 또다른 문자열을 화면상에 뿌려 주게 됩니다.
여기서 Else ~ 이하에 해당되는 조건이 많이 있을 경우 다음과 같이 보다 세분화해서 구분을 할 수도 있습니다.
Sub IfThen2()
If Time < 0.5 Then
MsgBox "Good Morning!", , "//Exceller"
ElseIf Time >= 0.5 And Time < 0.75 Then
MsgBox "Good Afternoon"
ElseIf Time >= 0.75 Then
MsgBox "잘자 내꿈꿔!", , "//Exceller"
End If
End Sub
이 프로시저의 경우, 세가지 서로 다른 조건을 비교해서 처리를 해 주고 있지요? 그런데 비교해야 할 조건식이 많은 경우 상당히 복잡하게 보입니다. 이론적으로 중첩 If 문장은 7개까지는 확장이 가능하지만 비교 조건이 3개를 넘어가면 Select Case문을 사용할 것을 권장합니다.
Step 3: Select Case 구문
위의 IfThen2 프로시저를 Select Case 文을 써서 이렇게 변경해 줄 수도 있습니다.
Sub SelectCase()
Dim Msg As String
Select Case Time
Case Is < 0.5
Msg = "Good Morning!"
Case 0.5 To 0.75
Msg = "Good Afternoon!"
Case Else
Msg = "잘자 내꿈꿔!"
End Select
MsgBox Msg, , "//Exceller"
End Sub
어떻습니까? 한결 보기가 편해졌지요? 읽기가 편할뿐만 아니라 새로운 조건을 추가할 경우에도 Case문만 추가하면 되고 10개, 100개의 조건 추가도 가능하겠지요?
Case 내에 또다른 Case가 들어가 있는 예제를 하나만 더 살펴보고 가도록 할까요?
Sub SelectCase2()
Select Case Application.WindowState
Case xlMaximized: MsgBox "창이 최대크기로 되어 있습니다.", , "//Exceller"
Case xlMinimized: MsgBox "창이 최소크기로 되어 있습니다.", , "//Exceller"
Case xlNormal: MsgBox "창이 Normal 상태이군요", , "//Exceller"
Select Case ActiveWindow.WindowState
Case xlMaximized: MsgBox "워크북이 최대모드로 되어 있군요", , "//Exceller"
Case xlMinimized: MsgBox "워크북이 최소모드로 되어 있군요", , "//Exceller"
Case xlNormal: MsgBox "워크북이 Normal 상태이군요", , "//Exceller"
End Select
End Select
End Sub
창의 크기를 여러 가지로 조절해 가면서 위의 프로그램을 실행해 보세요. 이처럼 여러분이 원하시는 만큼 Select Case문을 중복해서 사용할 수가 있는 것입니다. 단, 하나의 Select Case가 있으면 반드시 이에 대응하는 End Select 문이 존재해야 한다는 사실을 기억하시기 바랍니다.
마무리
나머지 제어구조에 대해서는 다음 시간에 설명을 드려야 할 것 같습니다. 오늘은 요기까지…
정리 — 실행순서 제어 핵심 정리
| 구문 | 예시 | 특징 |
|---|---|---|
| GoTo | If Len(UserName) = 0 Then GoTo mm | 지정 위치로 이동, 사용 최소화 |
| If ~ Then | If Time >= 0.5 Then | 가장 자주 쓰이는 조건문 |
| ElseIf | ElseIf Time >= 0.5 And Time < 0.75 | 여러 조건 분기 |
| Select Case | Select Case Time | 조건 3개 초과 시 권장 |
자주 묻는 질문 (FAQ)
Q1. GoTo 문은 언제 사용하나요?
달리 쓸 방법이 없을 때에 한해 사용하는 것이 좋으며, 주로 에러 트래핑에서 사용합니다.
Q2. Time >= 0.5는 무슨 뜻인가요?
시간은 0이 자정, 0.5가 정오이므로, 현재 시각이 정오 이후인지를 묻는 조건입니다.
Q3. Select Case를 사용할 때 주의할 점은 무엇인가요?
Select Case를 중첩해서 사용할 수 있지만, 하나의 Select Case마다 반드시 대응하는 End Select가 있어야 합니다.
마치며
나머지 제어구조(For ~ Next, Do While, Do Until)는 다음 시간에 이어서 설명드립니다.