박 담당과의 짧은 대화
Exceller: 엑셀 2007 이전 버전에서는 '도구 모음(Toolbar)'을 사용자화 하는 것이 아주 손쉬웠지.
박담당: 그 말은 뒤집어 말하면, 엑셀 2007에서는 별로 손쉽지 않다는 뜻인가요?
Exceller: (뜻밖의 예리한 반응에 놀랐으나 안그런 척 하며) 그렇지! 눈치가 아주 빠르군. 절에 가서도 능히 새우젓을 얻어먹겠어.
자, 그러면 눈치 빠른 여러분에게 묻겠습니다. 엑셀 2007 이전 버전에서는 '도구 모음'을 어떻게 만들었는지 기억나시나요?...(잠잠)... 안나시나요?
- '도구-사용자 지정' 메뉴를 선택합니다. 혹은 도구 모음의 빈 영역을 마우스 오른쪽 버튼으로 클릭하고 '사용자 지정'을 선택해도 됩니다.
- '사용자 지정' 대화상자에서 '새 도구 모음' 버튼을 클릭합니다.
- '새 도구 모음' 대화상자에서 도구 모음의 이름을 입력하고 '확인' 버튼을 클릭하면 사용자 지정 도구 모음이 화면에 나타나는데, 도구 모음에 추가할 아이콘을 여기로 끌어다 놓습니다(Drag & Drop).
대략 이런 순서로 했더랬습니다. 그런데 엑셀 2007에서는 모든 도구 모음이 [추가 기능] 탭의 [사용자 지정 도구 모음] 그룹에 표시가 됩니다. 하지만 이 도구 모음을 다른 곳으로 옮기거나 화면에 떠 있도록(영어로 floating) 할 수는 없습니다.
이번 강의에서는 도구 모음의 편리한 점 중 하나인 이동성, 다시 말해서 화면 아무 곳으로나 옮겨다 놓을 수 있도록 해 보겠습니다.
완성 예
유저폼에 이미지 컨트롤 삽입하기
눈치를 챈 분도 있겠습니다만(절에서 새우젓 얻어드실 그 분), 위에서 도구 모음 비스무리하게 생긴 것은 사실은 유저폼 UserForm과 이미지 Image 컨트롤을 이용하여 절묘하게 위장(?)을 한 것입니다.
1. VB Editor에서 유저폼을 하나 삽입하고 '도구 상자'에 있는 '이미지' 컨트롤을 필요한 만큼 삽입합니다. 그런 다음, 이미지 컨트롤의 Picture 속성을 이용하여 적당한 이미지를 지정합니다.
이미지 컨트롤에 그림 쉽게 붙여넣는 방법
2. 유저폼의 빈 공간을 더블 클릭하고 유저폼의 초기화 이벤트 프로시저를 작성합니다. Image 컨트롤의 ControlTipText 속성, 즉 마우스를 이미지로 가져갔을 때 화면에 표시될 간단한 도움말을 설정합니다.
Private Sub UserForm_Initialize()
Dim intControl As Integer
Dim i As Integer
Dim ctlControl As Control
intControl = Me.Controls.Count
For Each ctlControl In Me.Controls
i = i + 1
If TypeOf ctlControl Is msforms.Image Then
ctlControl.ControlTipText = i & "번 Macro를 실행합니다!"
End If
Next ctlControl
End Sub
CODE
이벤트 핸들러 프로시저 작성하기
이미지를 클릭하면 발생하는 Click 이벤트 핸들러 프로시저를 각각 작성합니다. ClickButton이라는 외부 프로시저를 실행하는데 그냥 실행하지 않고 1, 2, 3, ... 등과 같은 값을 함께 넘겨주는군요. 그렇게 하는 이유와 ClickButton 프로시저의 내용은 뒤에서 다룹니다.
Private Sub Image1_Click()
ClickButton 1
End Sub
Private Sub Image2_Click()
ClickButton 2
End Sub
Private Sub Image3_Click()
ClickButton 3
End Sub
Private Sub Image4_Click()
ClickButton 4
End Sub
Private Sub Image5_Click()
ClickButton 5
End Sub
Private Sub Image6_Click()
ClickButton 6
End Sub
Private Sub Image7_Click()
ClickButton 7
End Sub
Private Sub Image8_Click()
ClickButton 8
End Sub
Private Sub Image9_Click()
ClickButton 9
End Sub
Private Sub Image10_Click()
ClickButton 10
End Sub
CODE
이벤트 프로시저 선택 상자를 이용하여 각 이미지 컨트롤별로 MouseMove 이벤트 핸들러 프로시저를 작성합니다. MouseMove는 마우스 포인터를 해당 오브젝트로 가져갔을 때 발생하는 이벤트입니다. 얼핏보면 대단히 복잡해 보이지만 잘 뜯어보면 동일한 패턴이 계속 반복됨을 알 수 있습니다. 단지 이미지 컨트롤의 번호만 바뀔 따름입니다.
Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image1.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image2.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image3.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image4_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image4.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image5_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image5.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image6_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image6.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image7_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image7.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image8_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image8.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image9_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image9.SpecialEffect = fmSpecialEffectEtched
End Sub
Private Sub Image10_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
ResetButton
Image10.SpecialEffect = fmSpecialEffectEtched
End Sub
CODE
외부 프로시저 작성하기
이벤트 프로시저에서 호출한 2개의 외부 프로시저를 작성합니다. ResetButton은 마우스 포인터가 이미지를 떠났을 때, 그 이미지에 적용되었던 SpecialEffect 속성 값을 원래 상태로 되돌려주기 위한 프로시저이고, ClickButton은 사용자가 이미지 컨트롤를 클릭했을 때 몇 번째 것이 눌려졌는지를 알려주는 프로시저입니다. XXX라는 매개 변수 Parameter를 함께 실행하는 점에 유의하시기 바랍니다.
Sub ResetButton()
Dim ctlControl As Control
For Each ctlControl In UserForm1.Controls
ctlControl.SpecialEffect = fmSpecialEffectFlat
Next ctlControl
End Sub
Sub ClickButton(XXX)
MsgBox XXX & "번째 아이콘을 클릭하셨습니다!"
End Sub
CODE
끝으로, 유저폼을 화면에 띄우기 위한 프로시저를 작성합니다. 유저폼이 떠 있는 상태에서도 다른 작업이 가능하도록 하기 위해 모덜리스 대화상자를 표시합니다. 유저폼을 모덜리스 형태로 띄우는 것은 아주 간단해서, Show 메서드 뒤에 vbModeless라는 상수 Constants를 붙여주기만 하면 됩니다.
상수 대신에 값을 직접 입력하여 다음과 같이 표현할 수도 있습니다.
대화상자는 크게 모달 대화상자 Modal dialog box와 모덜리스 대화상자 Modeless dialog box로 구분됩니다. 대화상자가 뜬 상태에서는 [확인]이나 [닫기] 버튼 등을 눌러서 대화상자를 닫기 전까지는 다른 작업을 할 수 없는 대화상자를 모달 대화상자라고 합니다 (예를 들면 [셀 서식] 대화상자). 반면에 [피벗 테이블 만들기] 대화상자처럼 대화상자가 화면에 떠 있더라도 다른 작업을 할 수 있는 경우에는 모덜리스 대화상자라고 부릅니다
오늘 강의는 이쯤에서 접습니다. 휘리릭~~