Exceller Home > VBA 강좌 > VBA 입문강좌

Exceller's VBA 입문강좌

- 최초 작성일 : 2008-05-11
- 최종 수정일 : 2008-05-11
- 강좌 읽음수 : 46,478회
- 자료 작성자 :


- 강좌 제목 : 탭(Tab)에 그룹 추가하기

이번 강좌는 시 한편으로 시작하려 합니다.

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

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

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

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


예제 파일 내려받기


이번 강좌는 "<엑셀 2007 매크로와 VBA 날개달기>(디지털북스)"에서 편집/인용한 것입니다.

들어가기 전에...

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

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

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

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

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

http://www.iExceller.com/MyXls/Lectures/VisualBasic/VB0117.zip

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

위의 것은 'Power Tools'라는 추가 기능(Add-in) 파일을 엑셀 2003에서 실행시킨 것이고, 아래 것은 같은 파일을 엑셀 2007에서 실행시킨 것입니다. 보신 것처럼 엑셀 2007에서는 모든 도구 모음이나 사용자 지정 메뉴가 '추가 기능' 탭에 표시됩니다. 해마다 광복절 무렵이면 '파워툴스' 업그레이드 버전을 올려드리곤 했는데 최근 몇 년 동안은 뜸했습니다. 올 광복절에는 새로운 기능이 보강된 파워툴스를 여러분들께 선보일 수 있기를 기대해 봅니다.

리본 컨트롤에 접근하기

얘기가 잠시 삼천포로 흘렀습니다. 다시 본론으로 돌아와서...
VB
Editor 상태에서 보기-직접 실행 메뉴를 선택(또는 Ctrl+G )하여 직접 실행 창을 표시한 다음, 여기에 다음과 같이 입력하고 엔터키를 쳐 보세요.

?  Application.CommandBars.GetEnabledMso("RemoveDuplicates")

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

 

컨트롤 이름은 대소문자를 구분하므로 반드시 사용자 지정 메뉴에서 스펠링을 확인하세요. 또한 컨트롤 이름은 기본적으로 영문자만 지원합니다. 뒤에서 소개해 드릴 리본X 코드의 경우도 마찬가지이므로 책에서는 탭을 추가하거나 그룹을 추가하는 코드를 작성할 때 영문으로 작성하겠습니다.

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

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

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

를 들어 ExecuteMso 메서드를 사용하여 다음과 같이 표현하면 차트 삽입 대화상자가 나타납니다.

Application.CommandBars.ExecuteMso("ChartTypeAllInsertDialog")

Application.CommandBars.ExecuteMso("ChartTypeAllInsertDialog")

다음 코드를 실행하면 선택하여 붙여넣기 컨트롤에 대한 풍선 형태의 도움말이 표시됩니다.

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와 관련된 몇 가지 도움될만한 정보들이 들어 있습니다.

http://msdn.microsoft.com/ko-kr/magazine/cc163469.aspx

리본을 사용자화 하기 전에 ‘Office 단추 클릭하고 ‘Excel 옵션 버튼을 누릅니다. ‘Excel 옵션 대화상자에서 '고급'을 선택한 다음, '추가 기능의 사용자 인터페이스 오류 표시' 항목에 체크 표시를 해 두세요. 이렇게 해 두면 리본X 코드의 어느 부분에서 오류가 발생했는지 위치를 알려주므로 디버깅 작업을 수월하게 있습니다.

(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

(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>

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

(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!’라는 그룹이 추가되었고, 컨트롤을 클릭하면 앞에서 작성한 콜백 프로시저가 실행됩니다.

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

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

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

하지만 너무 걱정하지 마세요! 길이 있으면 뜻이 있는 ... 아니지... 뜻이 있으면 길이 있는 법이니까요. 이런 번거로운 과정을 거치지 않고서도 리본X XML 아이콘의 이미지를 변경할 있는 방법이 있습니다. 다음 사이트에 가 보시면 Open XML 파일 형식을 다루는데 필요한 여러 가지 도구들을 보실 있습니다.

http://openxmldeveloper.org/archive/2006/05/26/CustomUIeditor.aspx

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

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

XML 코드 내려받기

음 시간에는 새로운 탭을 만드는 방법에 대해 살펴보겠습니다. 벌써부터 기대되시죠?
‘Office 2007 Custom UI Editor’
이용할 예정이므로 이 도구의 사용법을 잘 익혀두시기 바랍니다. 사용 방법이 단순하니까 아이콘들을 몇번만 클릭해 보면 금방 손에 익으리라 생각합니다(오랜만에... 숙제로 내드립니다 ^^).


Previous

Next

Copyright ⓒ 2008 아이엑셀러 닷컴. All rights reserved.