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