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

제품:   Excel 버전:   공통
검색어:   메시지 박스, 자동
제목:   가짜 메시지 상자 사건
     
 

New Page 2
  STEP> 따라하기


필자의 입장에서 프로그래밍에 관한 질문중에는 종종 별난 것을 요청하는 경우를 만나게 됩니다. 가령 셀 포인터를 바꾸어 볼 수 있느냐?, 마우스의 움직임에 따라 셀을 자동으로 선택하게 할 수 있느냐? 등등. 물론 각자가 필요해서 질문하는 것들이지만 어느 상황에 이런 것이 필요한지 이해가 안가는 경우가 많습니다.

그러한 질문중 하나가 MsgBox에 관한 것도 있습니다. MsgBox가 나타나면 이것을 마우스로 클릭하지 않고 몇 초후 자동으로 사라지게 해달라는 것입니다. , API 함수를 가지고 이렇게 저렇게 하면 될 것입니다.  

그러나 이번에는 그런 머리 아픈 일을 하지 않을 생각입니다. 조금 더 편한 방법이 있으니까요? 자동으로 사라지는 메시지박스를 만들려면 가장 먼저 떠오르는 것이 Windows Script Host Object Model입니다. 이 라이브러리는 본래 윈도우 시스템 관리자가 시스템 관리를 자동화하기 위한 것입니다. 이 라이브러리의 여러 개체와 기능중 일정 시간동안 메시지 상자를 표시하는 기능이 있습니다.

먼저 VBE의 도구-참조메뉴를 이용하여 "Windows Script Host Object Model" 을 참조합니다. 참조를 해두는 것은 VBA의 기본기능이 아닌 외부 라이브러리를 사용하기 위한 절차입니다. 
다음에는 다음과 같은 코드를 일반모듈을 추가하여 입력합니다.

Sub Demo_SelfGoAway_Msgbox()
    Dim SH As IWshRuntimeLibrary.WshShell 
    Set SH = New IWshRuntimeLibrary.WshShell
    SH.Popup "Please Wait...", 3, "Short Message"
End Sub 

WshShell개체의 Popup 메소드는 메시지 상자를 출력합니다. 이때 전달하는 매개변수중 두 번째 인수인 ‘3’은 표시되는 초를 가리킵니다.

  
<그림1> WshShell개체의 Popup메소드를 이용한 메시지 상자

만일 참조하지 않고 사용하려면 CreateObject 를 사용하여 다음과 같이 사용할 수 있습니다.
Sub Demo_SelfGoAway_Msgbox()
    Dim SH As Object 
    Set SH = CreateObject("WScript.Shell")
     SH.Popup "Please Wait...", 3, "Short Message"
End Sub

그러나 오피스에서만 가능한 약간의 속임수를 부려볼 수도 있습니다. 다음 그림과 같은 메시지 상자를 3초간 보여주고 자동으로 사라지게 해주는 것은 어떨까요?


<그림2> 가짜 메시지 상자

위의 메시지 상자는 실제가 아니라 단순한 그림입니다. 일반적인 메시지 상자를 화면을 캡쳐하고 그 위에 텍스트 글 상자를 덮어 씌운 것입니다.


<그림3>화면캡쳐한 빈 메시지 상자


<그림4> 메시지 상자에 맞춰 넣을 텍스트 글 상자

워크시트에서 그림이나 텍스트 상자 등등은 모두 Shape개체입니다. Shape개체의 Visible속성을 True로 설정하여 3초간 보여주었다가 다시 그 속성을 False로 지정하여 다시 숨기는 꼼수를 부려 보는 것입니다. 

'//  Shape개체의 이름을 정의한 상수
Const MSGBOX As String = "messagebox" 

Sub ShortMessage()   
    '// Shape개체의 Visible속성을 True로 바꾸어 Shape를 보여준다
    Call DisplayWaitMessage(msoTrue)   

    '// 3초간 지연한다    
    WaitSeconds 3   

    '// Shape개체의 Visible속성을 True로 바꾸어 Shape를 숨긴다  
    Call DisplayWaitMessage(msoFalse)
End Sub 

'// 다음의 프로시져는 기타 부속 프로시져임
Public Sub WaitSeconds(waitTime As Integer)
    Application.Wait (Now + TimeValue("00:00:" & Format(waitTime, "00")))
End Sub 

Sub DisplayWaitMessage(blnVisible As Long)
    With Sheet1.Shapes(MSGBOX)
        .Visible = blnVisible
    End With
End Sub 

Sub ShowRectangle()
    Sheet1.Shapes(MSGBOX).Visible = msoTrue
End Sub 

Sub HideRectangle()
    Sheet1.Shapes(MSGBOX).Visible = msoFalse
End Sub