• 최초 작성일: 2000-11-01
  • 최종 수정일: 2026-09-30
  • 조회수: 6 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 유저폼의 CLOSE 버튼 못쓰게 하기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번 시간에는 질문 하나를 살펴봅니다.

…(중략) 유저폼 실행시 폼상단의 "캡션_Bar(좌측에 제목이 있고 우측에 있는 X)"가
나타나지 않게 하는 것이 가능한지요? 가능하다면 구현하는 코드를 알려주세요.
"캡션_bar" 우측의 X표를 disable로 할 수 있는지요?
가능하다면 구현코드를 부탁합니다.
좋은 밤 되세요…

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

유저폼의 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 버튼은 막고 [닫기] 버튼으로만 폼을 종료하게 만들 수 있습니다.