- 최초 작성일: 2000-11-01
- 최종 수정일: 2026-09-30
- 조회수: 6 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 유저폼의 CLOSE 버튼 못쓰게 하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 질문 하나를 살펴봅니다.
…(중략) 유저폼 실행시 폼상단의 "캡션_Bar(좌측에 제목이 있고 우측에 있는 X)"가
나타나지 않게 하는 것이 가능한지요? 가능하다면 구현하는 코드를 알려주세요.
"캡션_bar" 우측의 X표를 disable로 할 수 있는지요?
가능하다면 구현코드를 부탁합니다.
좋은 밤 되세요…
유저폼의 CLOSE 버튼 못쓰게 하기
핵심 요약: 유저폼 X 버튼 막기
QueryClose 이벤트에서 닫기 원인이 X 버튼인지 확인하고 Cancel을 True로 설정하면 유저폼이 닫히지 않습니다.
- 1단계: 유저폼에 안내 Label과 [닫기] 버튼을 배치합니다.
- 2단계: QueryClose 이벤트에서 CloseMode = vbFormControlMenu인지 확인합니다.
- 3단계: 메시지를 보여 주고 Cancel = True로 닫기를 취소합니다.
Step 1: 닫기 버튼 이해하기
UserForm을 삽입하면, 폼 우측 상단에 자동으로 닫기 버튼(우측 모퉁이의 X버튼)이 생기며, 프로그램 실행시 이 버튼을 클릭하면 유저폼을 종료하게 됩니다. 그런데 경우에 따라서는 이 버튼을 눌렀을 때 유저폼을 종료하지 못하도록 하고 싶을 때가 있을 것입니다. 위의 질문하신 분처럼 말입니다.
물리적으로 이 버튼을 없앨 수는 없지만(API 함수를 사용하면 가능합니다만 엄청나게 복잡합니다. 인건비도 못 건질 정도로… ^^) UserForm의 여러 가지 이벤트 중에서 QueryClose Event를 사용하면 이 버튼을 눌러도 유저폼을 닫지 못하도록 설정할 수는 있습니다.
Step 2: 유저폼 만들기
(1) VB Editor 상태에서 UserForm을 하나 삽입하고 아래와 같이 Label과 버튼을 하나 그려 넣습니다.
Step 3: QueryClose 이벤트 작성하기
(2) 유저폼의 빈 영역을 더블클릭 한 다음(또는 오른쪽 마우스 버튼을 누른 다음, "코드 보기"메뉴를 선택해도 됩니다), 이벤트 선택 상자에서 QueryClose Event를 선택하고 아래의 코드를 작성합니다.
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'//이 UserForm_QueryClose 이벤트는 보시는 것처럼 두 개의 요소(argument)를 사용합니다.
'//CloseMode argument는 QueryClose 이벤트가 발생하였는지의 여부에 대한 결과값을
'//담습니다.
Dim Msg As String
If CloseMode = vbFormControlMenu Then
'//CloseMode 값이 vbFormControlMenu와 같다는 것은 유저폼 우측 상단의 X 버튼이
'//눌려졌다는 의미입니다. 여기서 vbFormControlMenu는 내장 상수(built-in constants)
'//라고 하며 vbFormControlMenu는 0의 값을 가집니다. 따라서 이 문장을
'//If CloseMode = 0 Then 이렇게 해도 됩니다.
Msg = " 이 UserForm을 닫으시려면 [닫기] 버튼을 누르세요"
MsgBox Msg, , "Close Button 못쓰게 하기//Exceller"
Cancel = True
End If
End Sub
[닫기] 버튼에는 아래와 같이 유저폼을 닫는 코드를 연결해 둡니다. 이 코드는 QueryClose 이벤트를 발생시키지 않으므로 정상적으로 닫힙니다(버튼 이름은 cmdClose로 가정했습니다).
Private Sub cmdClose_Click()
Unload Me
End Sub
QueryClose 이벤트의 CloseMode 값은 vbFormControlMenu(0, 닫기 버튼), vbFormCode(1, Unload 문), vbAppWindows(2, 윈도우 종료), vbAppTaskManager(3, 작업 관리자 종료)로 구분됩니다. 이를 이용하면 X 버튼만 막고 나머지 닫기 경로는 그대로 허용할 수 있습니다.
마무리
11월의 첫날을 맞이한 기념으로 오늘은 짧게 여기까지 합니다. ^___^
다음 시간에 또…
정리 — X 버튼 막기 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 이벤트 | UserForm_QueryClose | 폼이 닫히기 직전에 발생 |
| 원인 확인 | CloseMode = vbFormControlMenu | X 버튼이 눌렸는지 판별 |
| 닫기 취소 | Cancel = True | 폼이 닫히지 않게 함 |
| 안내 | MsgBox Msg | 닫는 방법 알려주기 |
| 정상 종료 | Unload Me | [닫기] 버튼으로 폼 닫기 |
자주 묻는 질문 (FAQ)
Q1. 유저폼의 X 버튼을 없앨 수 있나요?
API 함수를 쓰면 가능하지만 매우 복잡하므로, 보통은 QueryClose 이벤트로 X 버튼 클릭을 무시하게 만듭니다.
Q2. QueryClose의 Cancel 인수는 무엇인가요?
True로 설정하면 폼이 닫히는 동작이 취소됩니다.
Q3. vbFormControlMenu는 어떤 값인가요?
X 버튼(컨트롤 메뉴)으로 닫을 때 CloseMode가 가지는 내장 상수이며 값은 0입니다.
마치며
QueryClose 이벤트를 활용하면 X 버튼은 막고 [닫기] 버튼으로만 폼을 종료하게 만들 수 있습니다.