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

Exceller's VBA 입문강좌

- 최초 작성일 : 2008-05-19
- 최종 수정일 : 2008-05-19
- 강좌 읽음수 : 30,275회
- 자료 작성자 :


- 강좌 제목 : 리본에 새로운 탭 추가하기

얼마 전에 읽은 글 중에 이런 것이 있었습니다(by 이비즈네트워크 CEO 최윤규).

당신이 원하든 원하지 않든 간에
자기가 내뱉은 말 한마디가
남 앞에 자신의 초상화를 그려놓는 것이다.
사람들은 그가 하는 말로써 그를 판단한다.
부정의 이미지가 아니라
긍정의 이미지가 떠올려지는 사람이 돼라.

우리는 흔히 남들이 나를 몰라준다고 야속해 합니다. 나의 본 모습은 그게 아닌데 사람들에게 잘못 인식되어 있다며 마음 아파합니다. 실체가 없으면 그림자 또한 존재할 수 없는 법입니다. 평소에 내가 한 말 한마디, 작은 행동 하나가 상대방의 뇌리에 조금씩 조금씩 흔적을 남기어 결국에는 '나'란 존재가 각인되는 것이겠지요.


예제 파일 내려받기


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

들어가기 전에...

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

지난 강좌 말미에 내드린 숙제검사(?)부터 하고 강좌 진행하겠습니다. 'Microsoft Office 2007 Custom UI Editor’와 친해져야한다고 했었는데 많이 사용해 보셨나요? 그러셨으리라 믿고...

새로운 탭 추가하기

이번에는 다음 그림과 같이 3개의 그룹을 가진 ‘Power Tools’라는 탭을 추가해 보겠습니다. 앞에서 소개해 드린 ‘Office 2007 Custom UI Editor(편의상 앞으로는 그냥 UI Editor라고 줄여서 부르겠습니다)’ 이용하여 작성하도록 하지요.

(1) 새로운 통합문서를 나 만든 다음 '리본X_탭추가.xlsm'이라는 이름으로 저장합니다. 물론 다른 이름으로 저장해도 상관없으나 파일 형식은 'Excel 매크로 사용 통합 문서(*.xlsm)' 파일 형식으로 지정하세요.

UI Editor 실행하고 방금 저장한 통합 문서를 엽니다. 새로운 탭을 생성하는 것 자체는 간단합니다. 다음과 같은 리본X 코드를 작성합니다. 직접 입력하기 어려우면 아래 내용을 긁어다 붙여 넣으세요.

<customUI xmlns='http://schemas.microsoft.com/office/2006/01/customui'>
<ribbon>
<tabs>
<tab id="MyTab" label="Power Tools"> </tab>
</tabs>
</ribbon>
</customUI>

엑셀로 가서 '리본X_탭추가.xlsm' 파일을 열어보면 ‘Power Tools’ 탭이 만들어져 있음을 확인할 수 있습니다. 그룹이나 아이콘이 빠져 있기는 하지만 말입니다.

(2) 허우대 뿐인 Power Tools 탭에 지능을 심어 볼까요? UI Editor를 실행한 다음 그룹과 컨트롤을 추가하는 리본X 코드를 입력합니다. 처음 보는 분이라면, '아니, 뭐가 이렇게도 복잡한 것이 다 있나??' 하며 현기증이 날 법도 합니다만, 코드의 세세한 부분까지는 알 필요가 없습니다. 여기서는 그저 반복되는 패턴만 눈으로 익혀두는 것으로 충분하니까 코드는 붙여넣기만 하세요.

코드 작성이 끝났으면 UI Editor ‘Validate’ 아이콘을 클릭해 보세요. XML 파일이 제대로 작성되었다면 'Custom UI XML is well formed!'라는 대화상자가 나타납니다.

(3) 리본X 코드에서 호출하는 콜백 프로시저를 작성할 차례입니다. ‘Generate Callbacks’ 아이콘을 클릭콜백 프로시저명이 나타나는데 범위를 지정한 다음 마우스 오른쪽 버튼을 클릭하고 'Copy' 메뉴를 선택합니다.

엑셀로 되돌아와서 해당 파일을 엽니다. ‘개발 도구 탭의 ‘Visual Basic’ 컨트롤을 클릭한 다음 모듈을 한 장 삽입하고, 앞에서 복사한 콜백 프로시저들을 붙여넣습니다.

리본의 탭을 추가하는 전체 흐름을 이해하는 것이 중요하므로 콜백 프로시저의 코드 내용은 뒷부분에서 한꺼번에 설명 드리겠습니다.

(4) 다음 그림을 참고로 MyBtn4 프로시저에서 호출하는 사용자 정의 폼을 작성합니다.

(5) ‘Power Tool’ 그룹에 있는 4개의 컨트롤에 연결된 콜백 프로시저 및 콜백 프로시저에서 호출하는 외부 프로시저들을 작성합니다.

마지막으로 ‘Versatile Print Manager’ 컨트롤에 연결되어 있는 2개의 프로시저를 작성합니다.

Sub ReverseOrderPrint(ByVal OK As Boolean, Optional ByVal EvenOrOdd As Byte)

프로시저를 시작할 때부터 예사롭지 않게 시작하였습니다. ByVal이라는 것은 인수를 전달할 참조 방식이 아닌 값에 의해 전달됨을 의미합니다. Optional이라는 것은 선택적 변수라는 것으로, 사용을 수도 있고 하지 않을 수도 있다는 것입니다. 필수 사양이 아니라 옵션 사양이라는 의미입니다. Optional 인수에 대해서는 다음 강좌의 '(3) 선택적 인수Optional argument를 가지는 사용자 정의 함수' 부분을 읽어보시기 바랍니다.

http://www.iexceller.com/MyXls/VBA_Beginner/VBA_Beginner10.asp

    Dim intTotalPage As Integer
    Dim i As Integer
    intTotalPage = ExecuteExcel4Macro("get.document(50)")

Excel4Macro에 대하여

초기의 엑셀((Excel 95 이전 버전)에서 매크로는 XLM이라는 확장자명을 갖는 별도의 파일에 코드를 따로 저장했었는데 이것을 XLM 매크로 또는 Excel4Macro라고 불렀습니다. XLM 매크로는 함수의 종류가 많았던 반면 배우기가 어려웠습니다. 워크시트의 전체 페이지수를 구하는 경우와 같이 아직도 Excel4Macro 도움을 받아야 하는 것이 있습니다.

    If intTotalPage Mod 2 = 0 Then intTotalPage = intTotalPage - 1
    If EvenOrOdd = 1 Then
        For i = intTotalPage To 1 Step -2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    ElseIf EvenOrOdd = 2 Then
        For i = intTotalPage + 1 To 1 Step -2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    Else
        For i = intTotalPage + 1 To 1 Step -1
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    End If

End Sub

Sub GeneralOrderPrint(ByVal OK As Boolean, Optional ByVal EvenOrOdd As Byte)

    Dim intTotalPage As Integer
    Dim i As Integer
    intTotalPage = ExecuteExcel4Macro("get.document(50)")
   
    If EvenOrOdd = 1 Then
        For i = 1 To intTotalPage Step 2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    ElseIf EvenOrOdd = 2 Then
        For i = 2 To intTotalPage Step 2
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    Else
        For i = 1 To intTotalPage
            ActiveSheet.PrintOut from:=i, To:=i, preview:=OK
        Next i
    End If

End Sub

이것 말고도 몇 개의 프로시저가 더 있습니다. 이와 관련해서는 예제 파일을 열어 직접 살펴보시기 바랍니다.

상에서 살펴본 것처럼, 엑셀 2007에서 리본을 사용자화 하는 작업은 이전 버전에서 커맨드 바 오브젝트를 이용하던 것과 비교하면 상당히 까다롭습니다. 따라서 특별한 경우가 아니라면 커맨드 바 오브젝트를 이용하는 것이 더욱 편리할 수 있다는 점을 염두에 두시기 바랍니다. 커맨드 바 오브젝트에 대한 사항은 예전에 소개해 드린 VBA 강좌들을 참고하세요. 커맨드 오브젝트를 사용하게 되면 다음과 같은 단점은 있습니다(속된 말로 '뽀대'는 좀 덜 납니다 ^^).

  • 모든 컨트롤이나 명령이 추가 기능 아래에 표시된다.

  • '도구 모음'을 만들 수 없다(이것은 리본X 코드를 작성하더라도 마찬가지).

  • 실행되지 않고 무시되는 프로퍼티나 메서드가 있을 수 있다.

이러한 사항들을 염두에 두고 사전에 테스트를 통해 확인을 한다면 커맨드 바 오브젝트는 엑셀 2007 버전에서도 여전히 하나의 대안이 듯 합니다.


Previous

Next

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