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

제품:   Excel 버전:   공통
검색어:   MsgBox
제목:   Modeless MsgBox 만들기
     
 

New Page 2
  STEP> 따라하기


※ 아래 Daily Tip은 곽승주님이 제공해주신 내용입니다

엑셀이 제공해주는 MsgBox를 단순히 메시지를 전달해주는 용도로 사용한다면 큰 불만이 없습니다. 그러나 종종 유별난 취향을 가진 사람은 뭔가 색다르거나 특별한 걸 원하는데, MsgBox의 경우에도 그들에겐 아쉬운 점이 있습니다(참! MsgBox가 뭔지는 아시죠?) MsgBox함수는 사용자와 통신을 하는 가장 간단한 방법입니다. 일방적으로 메시지를 보내기도 하지만 사용자에게 선택을 요구할 수도 있습니다.

그런데 MsgBox는 항상 모달입니다. 즉 이걸 닫지 않으면-사용자가 MsgBox에 반응을 하지 않으면-엑셀을 사용할 수 없습니다. 이러한 점이 유별난씨에게는 불만입니다. 그들은 이것에 답하기 전에 워크시트를 살펴본 후 대답을 하고자 하고 싶은 것입니다. 그래서 워켄바흐의 책에선 Userform을 사용하여 MsgBox를 만드는 얘기도 나옵니다.

모든 윈도우프로그램은 뭘로 만들어졌던지 간에 내부적으로는 API를 이용합니다. MsgBox가 비교적 간단한 것이지만 내부적으로는 API함수를 이용합니다.

모달이 아닌 덜 모달(모달리스) MsgBox를 만들려면 MessageBoxA 라는 API를 사용해야 합니다. 물론 그 사용법은 당연히 어렵습니다. 이 윈도우 메시지박스는 User32.DLL 파일에 담겨져 있습니다. 이걸 사용하려면 네 개의 매개변수를 주고 한 개의 값을 돌려받습니다. 4개 주고 1개 받으니 억울하죠?

여러분이 주어야 하는 4개의 매개변수는 다음과 같습니다.

hWnd

핸들값입니다. 메시지박스를 가질 윈도우의 핸들값입니다. 이것은 윈도우를 구별하는 식별숫자입니다. 널 값이나 0을 넣어두면 누구의 소유도 아닙니다. 그래서 메시지박스는 모달이 아닌 모달리스가 되는 셈입니다. 여기에선 0값을 줄 것입니다.

lpText 메시지박스에 출력할 내용입니다. MsgBox함수의 Prompt 매개변수와 같은 것입니다.
lpCaption 메시지박스 창 제목입니다. MsgBox함수의 Title 매개변수와 같은 것입니다.
wType 메시지가 표시되는 방법을 나타냅니다. MsgBox함수의 buttons 매개변수와 같은 것입니다.

돌려주는 값은 어느 버튼이 클릭되었는지를 가리키는 숫자입니다.
그러면 이제 오리엔테이션이 끝났으니 구체적으로 함수 사용법을 알아보도록 하죠. 먼저 다음과 같이 API함수를 선언합니다.

Private Declare Function MessageBox _
   Lib "User32" Alias "MessageBoxA" _
     (ByVal hWnd As Long, _
     ByVal lpText As String, _
     ByVal lpCaption As String, _
     ByVal wType As Long) As Long

 

그리고 예전에 MsgBox "This is a VBA MsgBox", , "My Box"와 같이 사용했다면 이번엔 다음과 같이 사용하면 됩니다.

MessageBox &H0, "This is a native Message Box", "My Box", vbOKOnly

또는
MessageBox &H0, "This is a native Message Box", "My Box", vbSystemModal

사용자와 교감하는 메시지박스를 만드는 예는 다음과 같습니다.

Dim Response As Long
Response = MessageBox(&O0, "땐스 한번 땡기실까요?", _
   "마가린 빠다 3세", vbYesNo + vbSystemModal)
If Response = vbYes Then
   '// 짜식! 이쁜 건 알아 가지고... -수락한다
Else
   '// 별 꼴이야! -거절한다
End If

다음은 메시지박스에서 사용자의 응답을 확인하는 코드 예입니다.

[참고]

Private Const MB_RETRYCANCEL = &H5&
Private Const MB_OKCANCEL = &H1&
Private Const MB_OK = &H0&
Private Const MB_ABORTRETRYIGNORE = &H2&
Private Const MB_YESNOCANCEL = &H3&
Private Const MB_YESNO = &H4&

Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA"  (ByVal _hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType _As Long) As Long

Sub API_MsgBox()
   Dim rval As Long
   rval = MessageBox(&H0, "Hello, How r u?", "Test Message", MB_ABORTRETRYIGNORE)
   Select Case rval
     Case 1
         MsgBox "Ok button Pressed"
     Case 2
         MsgBox "Cancel button Pressed"
     Case 3
         MsgBox "Abort button Pressed"
     Case 4
         MsgBox "Retry button Pressed"
     Case 5
         MsgBox "Ignore button Pressed"
     Case 6
         MsgBox "Yes button Pressed"
     Case 7
         MsgBox "No button Pressed"
   End Select

End Sub