• 최초 작성일: 2008-05-11
  • 최종 수정일: 2008-05-11
  • 조회수: 60,183 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: 탭(Tab)에 그룹 추가하기

엑셀러 권현욱

들어가기 전에

이번 강의는 시 한편으로 시작합니다.

하루 종일 밭에서 죽어라 힘들게 일해도
어머니는 그래도 되는 줄 알았습니다.
찬밥 한 덩이로 대충 부뚜막에 앉아 점심을 때워도
어머니는 그래도 되는 줄 알았습니다.
한겨울 냇물에서 맨손으로 빨래를 방망이질해도
어머니는 그래도 되는 줄 알았습니다.
배부르다, 생각 없다, 식구들 다 먹이고 굶어도
어머니는 그래도 되는 줄 알았습니다.
발 뒤꿈치 다 헤져 이불이 소리를 내도
어머니는 그래도 되는 줄 알았습니다.
손톱이 깎을 수조차 없이 닳고 문드러져도
어머니는 그래도 되는 줄 알았습니다.
아버지가 화내고 자식들이 속썩여도 끄떡없는
어머니는 그래도 되는 줄 알았습니다.
외할머니 보고 싶다. 외할머니 보고 싶다, 그것이 그냥 넋두리인 줄만
한밤중 자다 깨어 방구석에서 한없이 소리 죽여 울던 어머니를 본 후론....
아!.....
어머니는 그러면 안 되는 것이었습니다.
그러면....
안 되는 것이었습니다

ㅡ 어머니는 그래도 되는 줄 알았습니다, 심순덕

존경받는 부모가 되기는 쉬워도 사랑받는 부모가 되기는 어렵다는 말, 이제는 가슴으로 이해할 수 있을 것 같습니다.

"고맙습니다. 그리고... 사랑합니다."



리본과 관련된 이번 강의는 VBA 입문용이라고 하기에는 좀 무리가 있습니다만 별도 섹션으로 구분하기도 뭐하고 해서 그냥 이 범주에 포함시켰습니다. VBA를 처음 접하는 분이라면 '이런 것도 있군' 하는 정도로 부담 없이 읽고 넘어가셔도 됩니다.

- 이번 강의 콘텐츠는 "엑셀 2007 매크로와 VBA 날개달기"(디지털북스)에서 편집/인용하였습니다.

엑셀 2007 버전으로 넘어오면서 가장 크게 바뀐 부분 중 하나가 리본 Ribbon을 기반으로 한 사용자 인터페이스라고 할 수 있습니다. 엑셀 2007의 리본 Ribbon & Tab 인터페이스는 이전 버전의 '메뉴와 도구 모음' Menu & Toolbar 인터페이스와는 근본적으로 다릅니다. 기존 엑셀의 메뉴 구조에 익숙한 사용자일수록 엑셀 2007의 새로운 메뉴 구조에 적응하는데 애로를 겪기도 합니다. 엑셀 초보자일수록 엑셀 2007의 인터페이스에 잘 적응한다는 얘기도 그래서 나온 것 같습니다.

커맨드 바 개체

잠시 기억을 더듬어 보면, 엑셀 2003버전까지는 메뉴를 수정할 때 커맨드 바CommandBar 오브젝트를 사용하였으며, 다음과 같이 3가지 종류의 커맨드 바를 사용할 수 있다, 라고 예전 VBA 강의에서 소개해 드렸었습니다.

타입 상수 종류
0 msoBarTypeNormal 도구 모음(ToolBar)
1 msoBarTypeMenuBar 메뉴 바(MenuBar)
2 msoBarTypePopup 단축 메뉴(Shortcut Menu)

태어나서 그런 희안한 얘기는 처음 들어보신다구요? 그럴 리가요. (^^)

이 중에서 msoBarTypePopUp, 즉 단축 메뉴는 엑셀 2007 버전에서도 계속 사용할 수 있는 반면, 메뉴 바와 도구 모음은 리본으로 대체되었습니다. 이전 버전과의 호환성을 고려하여 과거 버전의 메뉴 바와 도구 모음도 사용할 수는 있습니다만 표시되는 위치가 [추가 기능] 탭으로 이동되며, 실행되지 않고 무시되는 속성이나 메서드도 다수 있습니다. 다음의 두 그림을 비교해 보세요.

BASIC

엑셀 2003에서 추가 기능을 실행한 모습 (정상 작동)

BASIC

엑셀 2007에서 추가 기능을 실행한 모습 (위치 이동)

위의 것은 'Power Tools'라는 추가 기능 파일을 엑셀 2003에서 실행한 것이고, 아래 것은 같은 파일을 엑셀 2007에서 실행한 것입니다. 엑셀 2007에서는 모든 도구 모음이나 사용자 지정 메뉴가 [추가 기능] 탭에 표시됩니다.

리본 컨트롤에 접근하기

VB Editor에서 [보기] - [직접 실행 창] 메뉴를 선택(또는 Ctrl + G 키)하여 직접 실행 창을 표시한 다음, 아래와 같이 입력하고 엔터 키를 쳐 보세요.

? Application.CommandBars.GetEnabledMso("RemoveDuplicates")

이 코드를 실행하면 True라는 결과값을 얻을 수 있습니다. 이것이 의미하는 것은 RemoveDuplicates 컨트롤, 즉 [데이터] 탭에 있는 [중복된 항목 제거] 컨트롤을 사용할 수 있는 상태라는 뜻입니다.

컨트롤 이름은 대소문자를 구분하므로 반드시 스펠링을 확인하세요. 또한 컨트롤 이름은 기본적으로 영문자만 지원합니다. 뒤에서 소개해 드릴 리본X 코드의 경우도 마찬가지입니다. 따라서 앞으로 작성하는 코드는 영문으로 합니다.

엑셀 2007에는 약 1,700개 이상의 컨트롤이 있습니다. 모든 컨트롤은 고유의 이름을 가지고 있어서 VBA로 프로그래밍을 할 때 이름을 사용하여 불러다가 일을 시킬 수 있습니다. 하지만 불행하게도 엑셀 2007에서는 수많은 리본 컨트롤의 이름이나 속성을 VBA를 통해 표시할 수 있는 방법을 제공하고 있지 않습니다. 컨트롤의 이름을 파악하는 유일한 방법은 [Excel 옵션] 대화상자의 [사용자 지정] 메뉴에서 직접 확인하는 방법 밖에 없습니다(혹시 다른 편리한 방법을 알고 계신 분은 알려주세요).

BASIC

컨트롤 이름을 확인할 수 있는 유일한 방법

앞에서는 커맨드 바 오브젝트의 GetEnabledMso 메서드로 테스트 해 보았는데 사용 가능한 메서드는 이것 말고도 몇 가지가 더 있습니다.

메서드 설명
ExecuteMso 컨트롤을 실행합니다.
GetEnabledMso 컨트롤이 사용 가능한 상태이면 True 값을 돌려줍니다.
GetImageMso 컨트롤의 이미지를 알려줍니다.
GetLabelMso 컨트롤의 레이블을 알려줍니다.
GetPressedMso 해당 컨트롤이 눌려졌으면 True 값을 돌려줍니다.
GetScreentipMso 해당 컨트롤의 스크린 팁 도움말을 표시합니다.
GetSupertipMso 해당 컨트롤에 대한 자세한 설명을 표시합니다.

예를 들어 직접 실행 창에 다음과 같이 입력하고 엔터 키를 누르면 [차트 삽입] 대화상자가 나타납니다.

Application.CommandBars.ExecuteMso("ChartTypeAllInsertDialog")

직접 실행 창에 다음 코드를 입력하고 엔터 키를 누르면 [선택하여 붙여넣기] 컨트롤에 대한 도움말 설명이 MsgBox에 표시됩니다.

Msgbox Application.CommandBars.GetScreentipMso("PasteSpecialDialog")

특정 컨트롤에 대한 자세한 설명을 보려면 GetSupertipMso 메서드를 사용합니다. ‘붙여넣기’ 컨트롤에 대한 자세한 설명을 보려면 이렇게 하면 됩니다.

Msgbox Application.CommandBars.GetSupertipMso("PasteMenu")

몇 가지 예제를 통해 살펴보았습니다만, 엑셀 2007에서는 이전 버전과는 달리 VBA 프로그래밍을 통해 리본을 제어하는 데 많은 제약이 있습니다. 새로운 탭을 추가하거나 그룹을 추가할 수 없으며, 기존 탭이나 그룹을 삭제할 수도 없습니다. 뿐만 아니라 컨트롤을 추가, 수정, 삭제, 비활성화 등을 할 수도 없습니다. 이전 버전에서 커맨드 바 오브젝트를 통해 엑셀의 메뉴나 도구 모음 등을 자유롭게 변경하던 것과 비교해 보면 정작 쓸데있는 일은 별로 할 수 없다는 생각을 떨칠 수가 없습니다.

그렇다면 리본을 커스터마이징(사용자화) 하는 방법은 정녕 없단 말인가?

VBA를 사용해서는 불가능합니다. 하지만 리본X 코드를 작성하면 가능은 합니다. 리본X 코드 RibbonX code란 XML eXtensible Mark-up Language을 이용하여 작성된 것으로 컨트롤의 모양이나 작동 명령과 관련된 각종 정보를 담고 있습니다. XML이나 리본X는 그 자체만으로도 방대하여 본 강의 범위를 벗어나므로 여기서는 리본X 코드를 사용하여 어떻게 리본을 사용자화 하는지에 대한 간단한 예제 몇 가지를 살펴보겠습니다(XML과 관련해서는 인터넷이나 전문 서적을 참고하세요).

기존 탭 아래에 새로운 그룹 추가하기

리본X 코드를 사용하여 기존의 탭 아래에 새로운 그룹을 추가해 보겠습니다. 비록 본 강의에서는 XML이나 리본X에 대한 자세한 설명은 담고 있지 않지만 단계적 설명을 통해 엑셀 2007의 사용자 인터페이스인 리본을 어떻게 사용자화 하는지에 대해서는 충분히 이해하실 수 있으리라 생각합니다.

여건이 되시는 분은 다음 게시물을 참고해 보세요. 리본X와 관련하여 도움될 만한 정보들이 들어 있습니다(영문 자료).

리본을 사용자화 하기 전에 [파일] - [옵션] 명령을 선택합니다. [Excel 옵션 대화상자에서 [고급]을 선택한 다음, [추가 기능의 사용자 인터페이스 오류 표시] 항목에 체크 표시를 해 두세요. 그러면 리본X 코드의 어느 부분에서 오류가 발생했는지 그 위치를 알려주므로 디버깅 작업 시 편리합니다.
BASIC

1. 새로운 통합 문서를 하나 만듭니다. 모듈을 하나 추가하고 두 개의 콜백 프로시저 Callback Procedure를 작성합니다. 콜백 프로시저란 리본의 컨트롤이 활성화 되었을 때 실행되는 프로시저를 뜻합니다.

Sub SayHello(control As IRibbonControl)()
    MsgBox "안녕하세요 " & Application.UserName & "님!"
End Sub

Sub GoodBye(control As IRibbonControl)
    Dim intAnswer As Integer
    intAnswer = MsgBox("파일을 닫을까요?", vbYesNo)
    If intAnswer = vbYes Then ThisWorkbook.Close
End Sub

CODE

2. 통합 문서의 이름을 ‘리본X_그룹추가.xlsm'이라고 지정하고 통합 문서를 닫습니다. 윈도우 탐색기를 이용하여 ‘리본X_그룹추가.xlsm' 파일이 저장된 폴더 안에 ‘customUI’라는 폴더를 만듭니다. 메모장이나 워드패드 같은 텍스트 에디터를 이용하여 다음과 같이 입력하고 ‘customUI.xml’이라는 이름으로 저장합니다.

<customUI xmlns='http://schemas.microsoft.com/office/2006/01/customui'>
<ribbon>
    <tabs>
    <tab idMso="TabData">
    <group id="Group1" label="Hi, there!">
    <button id="Button1"
    label="Hello!"
    size="normal"
    onAction="SayHello"
    imageMso="ReviewAllowUsersToEditRanges" />
    <button id="Button2"
    label="Goodbye~~"
    size="normal"
    onAction="Goodbye"
    imageMso="InkToolsClose" />
    </group>
    </tab>
    </tabs>
    </ribbon>
</customUI>

CODE

3. ‘리본X_그룹추가.xlsm' 파일 이름 뒤에 ‘.zip’을 추가하여 파일 이름을 ‘리본X_그룹추가.xlsm.zip'으로 수정합니다. 앞에서 작성한 customUI 파일을 리본X_그룹추가.xlsm.zip 파일로 드래그하여 추가시킵니다. 리본X_그룹추가.xlsm.zip 파일을 더블 클릭 해보면 그림과 같이 하위에 폴더들이 나타납니다.

BASIC

4. ‘_rels’ 폴더를 더블 클릭한 다음 ‘.rels’ 파일을 zip 파일 바깥으로 드래그 합니다(예를 들면 바탕화면). 워드패드를 이용하여 ‘.rels’ 파일을 엽니다. 다음 내용을 </Relationships> 태그 앞 적당한 곳에 삽입합니다.

<Relationship Id="RibbonXTest" 
Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" 
Target="customUI/customUI.xml"/>

5. 파일을 저장한 다음 바탕화면에 있는 .rels 파일을 드래그하여 zip 파일 내의 원래 위치로 옮깁니다. 즉 덮어 쓰기 하는 겁니다. 윈도우 탐색기에서 리본X_그룹추가.xlsm.zip 파일의 이름을 다시 원래대로 바꾸어 줍니다(리본X_그룹추가.xlsm). 이제 엑셀에서 이 파일을 열어 보세요. [데이터] 탭에 [Hi, there!]라는 그룹이 추가되었고, 컨트롤을 클릭하면 앞에서 작성한 콜백 프로시저가 실행됩니다.

BASIC

앞에서 작성한 코드, 즉 [데이터] 탭 아래에 새로운 그룹을 추가한 코드는 현재 워크북에서만 적용됩니다. 만약 모든 파일에서 적용되도록 하려면 추가 기능 파일(.xla 또는 .xlam)로 만들거나 ‘개인용 매크로 통합 문서(Personal.xlsb)’에 저장하면 됩니다.

이상의 복잡한 과정을 통해 우리는 Open XML 파일이 "다양한 방식으로 서로 연결되어 있는 여러 개의 파일들을 포함하는 압축 패키지"임을 알 수 있습니다. 그런데 매번 리본의 내용을 변경할 때마다 .zip 파일로 변경하고 내용을 편집하고 다시 원래대로 되돌리고 하는 이런 일련의 과정은 참으로 번거롭습니다. 여기까지 보신 분 중에서는 아마도 이런 생각을 하는 분도 있을 것 같습니다.

'아, 리본을 사용자화 하는 것은 내 적성에 맞지 않으니 이쯤에서 다른 재미난 것을 찾아야겠다~~’

하지만 너무 걱정하지 마세요! 길이 있으면 뜻이 있는 법... 아니지, 뜻이 있으면 길이 있는 법이니까요. 이런 번거로운 과정을 거치지 않고서도 리본X의 XML과 아이콘의 이미지를 변경할 수 있는 방법이 있습니다.

이 도구를 이용하면 앞서 수행했던 여러 단계에 걸친 성가신 작업들을 하지 않아도 될뿐만 아니라 리본X 코드를 작성한 다음 유효성 검사를 바로 할 수 있고, 콜백 프로시저 이름도 자동으로 생성해 주므로 VBA 모듈에 그대로 복사하여 사용할 수 있습니다.

BASIC

Custom UI Editor를 실행한 모습

위의 XML 코드가 잘 안보이거나 직접 입력하기 어려운 분은 다음 예제 파일을 내려받아 Custom UI Editor에 붙여 넣으세요.

다음 시간에는 새로운 탭을 만드는 방법에 대해 살펴보겠습니다. 벌써부터 기대되시죠? (^^)

Custom UI Editor를 이용할 예정이므로 이 도구의 사용법을 잘 익혀두시기 바랍니다.