- 최초 작성일: 2002-10-10
- 최종 수정일: 2026-09-30
- 조회수: 8 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 프로시저 실행 중단하기 (EnableCancelKey)
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Obstacles are the things a person sees when he takes his eye off the goal. 고난을 보려거든 자기 목표에서 눈을 떼어 봐라.
목표가 없는 항해의 위험성은 누구나 알고 있습니다. 하지만 '인생'이라는 항해에서도 명확한 목표를 세우고 항상 직시하고 있는지 숙고해 볼 일입니다. 우선 저 자신부터가...
프로시저 실행 중단하기 (EnableCancelKey)
핵심 요약: 프로시저 실행 중단
Application.EnableCancelKey를 xlErrorHandler로 지정하면 Esc나 Ctrl+Break 입력이 오류 18로 전달되므로 오류 처리 구문에서 중단을 처리할 수 있습니다.
- 1단계: EnableCancelKey = xlErrorHandler로 지정합니다.
- 2단계: On Error GoTo로 오류 처리 구문을 설정합니다.
- 3단계: Err가 18이면 사용자가 중단한 것이므로 안내 후 상태를 정리합니다.
Step 1: 어떤 질문이었을까요?
Do ~ Loop를 사용하는 프로그램이 조건을 만족하지 못해 무한 루프에 빠지면 Esc 키를 눌러 종료해야 하는데, 특정한 키를 눌렀을 때 자동으로 루프를 빠져나오게 할 수는 없느냐는 질문이었습니다.
Step 2: 프로시저 실행 중단하기
VBA 프로시저는 독점적(Exclusive)이어서 보통의 방법으로는 중단되지 않습니다. 특정한 키를 설정하여 빠져나오도록 할 수도 있겠습니다만, 대개의 경우, Esc 키나 Ctrl + Break 키를 눌러 중단하는 것이 보통입니다. 아래 버튼을 누르세요.
Sub EscTest()
Dim i As Long
On Error GoTo ET
With Application
.DisplayStatusBar = True
' 상태 표시줄을 화면에 표시하고...
.EnableCancelKey = xlErrorHandler
' 못 보던 것이 하나 나왔군요. EnableCancelKey 라는 프로퍼티는 실행 중인 프로시저에 대한
' 사용자 인터럽트를 처리하는 방법을 제어하는 속성입니다. 쉽게 말해서... Esc나 Ctrl + Break
' 키를 눌러 프로시저를 종료할 것이냐 못하도록 할 것이냐 등을 설정해 주는 것입니다.
' XlEnableCancelKey은 다음과 같은 XlEnableCancelKey 상수 중 하나가 될 수 있습니다.
For i = 1 To 900000
Select Case i
Case 0 To 300000
.StatusBar = "끝날려면 아직 멀었습니다! 중지하시려면 Esc나 Ctrl + Break 키를 누르세요... " & i
Case 300001 To 600000
.StatusBar = "인내력이 대단하시군요! 중지하시려면 Esc나 Ctrl + Break 키를 누르세요... " & i
Case 600001 To 900000
.StatusBar = "고집이 세시군요! 중지하시려면 Esc나 Ctrl + Break 키를 누르세요... " & i
End Select
' For ~ Next 문을 사용하여 I 값을 계속 증가시켜 나갑니다. 이 때 I 값이 얼마냐에 따라
' 상태표시줄의 텍스트를 다른 값으로 업데이트 시킵니다.
Next i
ET:
' 에러가 발생하였을 경우에 대한 처리 부분입니다.
If Err = 18 Then
' 에러 코드가 18이라는 것은 사용자가 Esc나 Ctrl + Break 키를 누른 경우를 의미합니다.
MsgBox "사용자에 의해 실행이 강제 중단되었습니다!", , "www.iExceller.com"
ElseIf Err <> 0 Then
MsgBox Err.Description, , "에러 번호 : " & Err.Number
End If
.StatusBar = False
.EnableCancelKey = xlInterrupt
End With
End Sub
Application.EnableCancelKey 속성은 실행 중인 프로시저에 대한 사용자 인터럽트를 어떻게 처리할지 제어합니다. 즉 Esc나 Ctrl + Break 키로 프로시저를 종료하게 할 것인지 못하게 할 것인지를 정합니다. 사용할 수 있는 XlEnableCancelKey 상수는 다음과 같습니다.
| 상수 | 설명 |
|---|---|
| xlDisabled | 취소 키를 전혀 사용할 수 없습니다. |
| xlErrorHandler | 실행 중인 프로시저에 인터럽트를 오류로 보내고, 이 오류는 On Error GoTo 문으로 설치된 오류 처리기에서 잡을 수 있습니다. 잡을 수 있는 오류 코드는 18입니다. |
| xlInterrupt | 현재 프로시저는 중단되며 사용자가 프로시저를 디버그하거나 종료할 수 있습니다. |
이 예제에서는 xlErrorHandler를 지정했으므로 사용자가 Esc나 Ctrl + Break를 누르면 오류 번호 18이 발생하고, 오류 처리 구문에서 이를 확인해 안내 메시지를 표시합니다. For ~ Next 문에서 변수 i의 값에 따라 상태 표시줄의 문구도 달라지도록 하였습니다.
프로시저 실행 중단에 대해 설명드리다 보니... 상태 표시줄에 대한 것도 보너스로 설명 드리게 되었군요. ^^ 많이 응용해 보시기 바랍니다.
다음 시간에 또...
정리 — 실행 중단 핵심 정리
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 인터럽트 처리 | .EnableCancelKey = xlErrorHandler | 취소 키를 오류로 전달 |
| 중단 오류 번호 | Err = 18 | 사용자 인터럽트 확인 |
| 상태 표시줄 | .StatusBar = 문자열 | 진행 문구 표시 |
| 상태 복원 | .StatusBar = False | 기본 표시로 되돌리기 |
| 키 | Esc / Ctrl + Break | 프로시저 중단 |
자주 묻는 질문 (FAQ)
Q1. 실행 중인 VBA 프로시저는 어떻게 중단하나요?
일반적으로 Esc 키나 Ctrl + Break 키를 눌러 중단합니다.
Q2. EnableCancelKey에는 어떤 값을 지정할 수 있나요?
취소 키를 사용하지 못하게 하는 xlDisabled, 오류로 전달하는 xlErrorHandler, 프로시저를 중단시키는 xlInterrupt가 있습니다.
Q3. 사용자가 중단했는지는 어떻게 알 수 있나요?
xlErrorHandler로 지정한 경우 중단하면 오류 번호 18이 발생하므로 오류 처리 구문에서 Err를 확인합니다.
마치며
오래 걸리는 작업에는 상태 표시줄로 진행 상황을 알려 주고 중단할 수 있는 방법도 함께 안내해 주면 사용성이 좋아집니다.