• 최초 작성일: 2008-05-27
  • 최종 수정일: 2008-05-27
  • 조회수: 35,603 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: 엑셀 2007에서 도구 모음 흉내내기

엑셀러 권현욱

들어가기 전에

미국산 쇠고기 수입 문제로 온 나라가 벌집 쑤셔놓은 듯 어수선합니다. "수입을 하더라도 안먹으면 그만"이라는 어느 고위 공직자(?)의 말에 아연실색하지 않을 수 없습니다. 문제의 본질은 쇠고기를 수입하느냐 마느냐 혹은 그것을 먹느냐 마느냐가 아닌데 말입니다.

대한민국의 주권은 국민에게 있고 모든 권력은 국민으로부터 나온다(헌법 1조 2항)
공무원은 국민전체에 대한 봉사자이며 국민에 대하여 책임을 진다(헌법 7조 1항)

이런 오래된 헌법조문을 굳이 상기할 필요도 없을 듯 합니다. 설령 정부가 하는 일이 100퍼센트 옳은 것이라 해도 국민이 싫다고 하면 설득과 커뮤니케이션을 통해 이해시키는 노력을 해야지, 이 길이 옳은 길이니까 무조건 따라오라는 식으로 하는 것은 올바른 자세가 아니라고 생각됩니다. 이럴 때 일수록 열 받지 말고 감정을 잘 조절하며 살아야겠습니다.

감정을 창조하는 연출가가 돼라.
나는 당신이 감정에 끌려 다니지 말고,
감정을 능수능란하게 다루고 즐기는 연출가가 되기를 바란다.
감정의 주인으로서 춤을 추듯이 감정을 타고 즐겨라.
감정은 운명이 아니다. 내가 스스로 창조하는 것이다.
원하는 감정을 스스로 창조하고,
그것을 지속적으로 유지할 수 있다면
당신은 인생의 주인공이 될 수 있을 것이다.

ㅡ 뇌파진동, 이승헌

감정에 이끌려 다니지 않고 감정의 연출가가 되기 위해서는 "자극과 반응 사이의 간격" 유지가 무엇보다 중요합니다. 외부의 이벤트는 내가 어찌할 수 없지만, 내부의 반응은 내가 제어할 수 있으니까요.



박 담당과의 짧은 대화

Exceller: 엑셀 2007 이전 버전에서는 '도구 모음(Toolbar)'을 사용자화 하는 것이 아주 손쉬웠지.

박담당: 그 말은 뒤집어 말하면, 엑셀 2007에서는 별로 손쉽지 않다는 뜻인가요?

Exceller: (뜻밖의 예리한 반응에 놀랐으나 안그런 척 하며) 그렇지! 눈치가 아주 빠르군. 절에 가서도 능히 새우젓을 얻어먹겠어.

자, 그러면 눈치 빠른 여러분에게 묻겠습니다. 엑셀 2007 이전 버전에서는 '도구 모음'을 어떻게 만들었는지 기억나시나요?...(잠잠)... 안나시나요?

  • '도구-사용자 지정' 메뉴를 선택합니다. 혹은 도구 모음의 빈 영역을 마우스 오른쪽 버튼으로 클릭하고 '사용자 지정'을 선택해도 됩니다.
  • '사용자 지정' 대화상자에서 '새 도구 모음' 버튼을 클릭합니다.
  • '새 도구 모음' 대화상자에서 도구 모음의 이름을 입력하고 '확인' 버튼을 클릭하면 사용자 지정 도구 모음이 화면에 나타나는데, 도구 모음에 추가할 아이콘을 여기로 끌어다 놓습니다(Drag & Drop).

대략 이런 순서로 했더랬습니다. 그런데 엑셀 2007에서는 모든 도구 모음이 [추가 기능] 탭의 [사용자 지정 도구 모음] 그룹에 표시가 됩니다. 하지만 이 도구 모음을 다른 곳으로 옮기거나 화면에 떠 있도록(영어로 floating) 할 수는 없습니다.

로딩 중...

이번 강의에서는 도구 모음의 편리한 점 중 하나인 이동성, 다시 말해서 화면 아무 곳으로나 옮겨다 놓을 수 있도록 해 보겠습니다.

로딩 중...

완성 예

유저폼에 이미지 컨트롤 삽입하기

눈치를 챈 분도 있겠습니다만(절에서 새우젓 얻어드실 그 분), 위에서 도구 모음 비스무리하게 생긴 것은 사실은 유저폼 UserForm과 이미지 Image 컨트롤을 이용하여 절묘하게 위장(?)을 한 것입니다.

로딩 중...

1. VB Editor에서 유저폼을 하나 삽입하고 '도구 상자'에 있는 '이미지' 컨트롤을 필요한 만큼 삽입합니다. 그런 다음, 이미지 컨트롤의 Picture 속성을 이용하여 적당한 이미지를 지정합니다.

로딩 중...

이미지 컨트롤에 그림 쉽게 붙여넣는 방법

1) 워크시트 상태에서 [삽입] 탭 - [일러스트레이션] 그룹 - [그림] 명령을 클릭합니다.
2) [그림 삽입] 대화상자에서 적당한 이미지들을 워크시트에 삽입합니다.
3) 삽입된 이미지를 선택하고 '복사'합니다.
4) VB Editor로 가서 그림을 삽입할 Image 컨트롤을 선택합니다. [속성 창] 중간쯤에 있는 [Picture] 속성을 클릭한 다음 Ctrl + V 키를 누르면 이미지 컨트롤에 그림이 삽입됩니다.

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를 붙여주기만 하면 됩니다.

UserForm1.Show vbModeless

상수 대신에 값을 직접 입력하여 다음과 같이 표현할 수도 있습니다.

UserForm1.Show 0

대화상자는 크게 모달 대화상자 Modal dialog box와 모덜리스 대화상자 Modeless dialog box로 구분됩니다. 대화상자가 뜬 상태에서는 [확인]이나 [닫기] 버튼 등을 눌러서 대화상자를 닫기 전까지는 다른 작업을 할 수 없는 대화상자를 모달 대화상자라고 합니다 (예를 들면 [셀 서식] 대화상자). 반면에 [피벗 테이블 만들기] 대화상자처럼 대화상자가 화면에 떠 있더라도 다른 작업을 할 수 있는 경우에는 모덜리스 대화상자라고 부릅니다

오늘 강의는 이쯤에서 접습니다. 휘리릭~~