배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   Userform, UserForm_QueryClose(), 프로시져
제목:   UserForm_QueryClose()프로시져
     
 

새 페이지 1

  STEP> UserForm_QueryClose()

Userform의 이벤트 프로시저 중 Sub UserForm_QueryClose(...)라는 것이 있습니다. QueryClose라는 단어를 보고 유추하건 데, 아마도 Userform을 닫기 전에 뭔가를 재확인하기 위한 것인 듯 합니다.

Sub UserForm_QueryClose(...)이벤트 프로시저는 Userform의 컨트롤 메뉴인 ‘x’버튼을 클릭하거나 ‘Unload Me’를 통해 발생합니다. 즉 어느 방법으로 종료하든 Sub UserForm_QueryClose(...)이벤트 프로시저를 거치게 됩니다.

그러나 사실 오늘의 관심사는 Sub UserForm_QueryClose(...)의 매개변수인 Cancel As Integer와  CloseMode As Integer입니다.

Cancel은 사용자의 Userform을 종료명령의 취소여부를 지정하는 것입니다. Cancel을 True로 두게 되면 말 그대로 Userform의 종료는 취소될 것입니다.
 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)   

    Cancel = True

End Sub

따라서 사용자는 Userform을 닫지 못하게 됩니다. 다만 Ctrl+Break키를 통해 중지시킬 수 있습니다.

그러면 CloseMode라는 매개변수는 대체 뭘까요? 말 뜻으로 봐서는 닫는 방식을 알려주는 것 같습니다. CloseMode는 열거형 상수인 VbQueryClose의 구성원을 값으로 가집니다.

다음의 표는 VbQueryClose의 각각의 값과 이에 대한 설명입니다.

상수

설          명

vbFormControlMenu

0

The user chose the Close command from the Control menu on the form.

vbFormCode

1

The Unload statement is invoked from code.

vbAppWindows

2

The current Microsoft Windows operating environment session is ending.

vbAppTaskManager

3

The Windows Task Manager is closing the application.

vbFormMDIForm

4

An MDI child form is closing because the MDI form is closing. Not supported for UserForm.

시험삼아 Userform을 두고 다음과 같은 코딩을 해보시죠. Userform에는 하나의 CommandButton(Caption은 cmdCancel )을 올려두었습니다.

Private Sub cmdCancel_Click()

    Unload Me

End Sub

 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    If CloseMode = VbQueryClose.vbFormControlMenu Then

        MsgBox "컨트롤 버튼을 이용하여 닫습니다"

    ElseIf CloseMode = VbQueryClose.vbFormCode Then

        MsgBox "코딩을 통해서 닫습니다"

    End If

End Sub


<그림.컨트롤 버튼을 이용한 userform닫기>


<그림.Cancel 버튼을 이용한 userform닫기>

이것을 이용하여 컨트롤 버튼을 이용하여 닫지 못하도록 만들 수 있습니다. (이럴 필요가 있나 싶은데 종종 이런 걸 원하는 사람들도 있습니다)

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    If CloseMode = VbQueryClose.vbFormControlMenu Then

        Cancel = True

    End If

End Sub

 
  참고> Cancel 매개변수에 대해서
엑셀의 이벤트 프로시저 중 Cancel 매개변수를 가진 것만 골라 보았습니다.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)