VBA를 이용하면 내가 원하는 모양으로 엑셀의 리본메뉴에 사용자정의(커스텀) 탭과 버튼을 추가하고 버튼에 기능을 추가할 수 있다. 방법이 좀 복잡하지만 익혀 놓으면 유용한 기능이다.
아래 순서대로 따라해 보자.
1. 엑셀파일을 하나 만들고 콜백 프로시저 추가
우선 다음과 같은 엑셀파일을 하나 만든다.
VBA로_리본메뉴에_탭_버튼추가하기.xlsx
위에서 만든 파일을 열고 Alt+F11을 클릭해서 모듈을 추가하고 다음의 콜백 프로시저를 추가한다.
Sub loadCustomTabOfRibbon(ribbon As IRibbonUI) '//엑셀이 시작되면 사용자정의 탭을 활성화시킨다. On Error Resume Next ribbon.ActivateTab "myTabId001" End Sub Sub previewFromRibbon(control As IRibbonControl) '//리본의 사용자정의탭에 추가한 버튼을 클릭하면 실행되는 콜백프로시저 MsgBox "미리보기가 클릭되었습니다!" End Sub Sub aboutFromRibbon(control As IRibbonControl) '//리본의 사용자정의탭에 추가한 버튼을 클릭하면 실행되는 콜백프로시저 MsgBox "확인! 버튼이 클릭되었습니다!" End Sub
콜백 프로시저 추가 후 엑셀파일을 다음과 같이 매크로파일(확장자가 xlsm)로 저장한다.
VBA로_리본메뉴에_탭_버튼추가하기.xlsm
2. 사용자정의용 리본용 xml 파일 준비
리본메뉴에 사용자의용 탭과 버튼을 추가하려면 customUI.xml파일이라는 것이 필요하다. 이 파일은 사용자정의 탭, 버튼의 구조를 정의하는 기능을 한다.
customUI폴더를 만들고, 그 폴더 안에 메모장이나 Notepad++같은 텍스트에디터 프로그램을 이용하여 customUI.xml 파일을 하나 만든다.
customUI.xml파일을 열어서 다음 내용을 추가한다.
<customUI onLoad="loadCustomTabOfRibbon" xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="myTabId001" label="리본에 탭 추가" insertAfterMso="TabHome"> <group id="groupId001" label="그룹이름입니다" > <button id="buttonId001" label="미리보기" size="large" onAction="previewFromRibbon" imageMso="FilePrintPreview" screentip="미리보기 버튼을 클릭하면 메시지가 표시됩니다." /> <separator id="MySeparator1" /> <button id="buttonId002" label="확인!" size="large" onAction="aboutFromRibbon" imageMso="HighImportance" screentip="확인 버튼을 클릭하면 메시지가 표시됩니다."/> </group> </tab> </tabs> </ribbon> </customUI>
3. 파일확장자를 zip으로 바꾸고 리본용 customUI.xml파일 추가
xlsm파일은 사실 여러 파일이 포함되어 있는 압축파일이다. 그래서 확장자 xlsm을 zip으로 바꾸고 압축프로그램으로 열어보면 여러 파일이 포함된 것을 확인할 수 있다.
VBA로_리본메뉴에_탭_버튼추가하기.xlsm 파일을 VBA로_리본메뉴에_탭_버튼추가하기.zip으로 바꾸고 압축프로그램을 실행하면 아래와 같이 zip파일의 내부 구조가 보인다. 이 상태에서 좀 전에 만든 customUI폴더를 마우스를 이용하여 zip 파일쪽으로 이동시킨다.
폴더째로 압축파일 안으로 들어가는 것인데, 이렇게 하면 사용자 정의 리본메뉴가 엑셀파일에 추가된다. 정상적으로 작업이 되었다면 아래 그림처럼 보인다.
4. .rels파일을 만들고 zip파일에 추가
압축파일의 내부를 보면 아래와 같이 "_rels"라는 폴더가 보인다.
이 폴더를 클릭하면 .rels파일이 보인다.
.rels파일은 위의 압축파일 안의 파일들의 관계정보를 저장해 놓은 것이라고 보면 된다. 위에서 우리는 customUI.xml파일을 추가했으므로 이것과 관련된 관계정보를 .rels에 추가해 주어야 리본메뉴에 사용자 정의 탭, 버튼이 보여진다.
이 파일을 zip파일에서 밖으로 꺼내온다. 마우스를 이용해서 끌어내면 밖으로 나온다.
꺼낸 .rels파일을 텍스트에디터로 열어서 다음을 파일의 맨 아래 줄의 "</Relationships>"위에 추가한다.
<Relationship Id="myRibbonCustomTabId001" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>
정상적으로 추가되었다면 다음과 같은 모양이 된다.
.rels파일을 저장하고 다음 그림과 같이 마우스를 이용하여 .rels파일을 zip파일 안으로 다시 넣는다.
5. 압축파일을 닫고 확장자를 zip에서 xlsm으로 변경
위 4)번까지의 작업을 완료하고 압축프로그램을 종료하면 변경사항이 모두 압축파일에 반영된다. 다음과 같이 확장자 zip을 원래의 xlsm으로 바꾼다.
VBA로_리본메뉴에_탭_버튼추가하기.zip => VBA로_리본메뉴에_탭_버튼추가하기.xlsm
이제 이 엑셀 매크로 파일을 열어보자. 홈탭 바로 다음에 "리본에 탭 추가" 탭이 추가되어 있을 것이다.
버튼을 클릭해 보면 다음과 같이 메시지가 나타난다.
위의 1)번에서 추가한 콜백 프로시저가 실행된 것이다. 단순히 메시지를 띄우는 대신 각자 필요한 코드를 콜백프로시저에 추가하면 된다.
이상으로 "VBA로 엑셀 리본메뉴에 사용자정의 탭,버튼 추가하기" 설명을 마친다.
구체적인 기능은 첨부의 실습용 파일을 참고하면 된다. 보안의 이유로 xlsm파일이 업로드가 안되므로 압축파일로 만들어서 업로드한다. 다운로드 후 압축을 풀어서 사용해야 한다.
[ VBA ]
- 비 개발자를 위한 VBA 프로그램 수정 방법
- 해가 바뀌어도 계속 누적되는 프로젝트 주차 구하기
- VBA로 엑셀 리본메뉴에 사용자정의 탭,버튼 추가하기
- VBA - 엑셀 시트의 값을 참조하여 콤보박스 목록 채우기
오 대단히 감사합니다.
잘 되네요.
많이 고민하고 구글링도 여러번 해봤는데
이렇게 잘 정리해주셔서 쉽게 이해했고 적용했습니다.
다시한번 감사드립니다.
감사합니다.
안녕하세요?
위의 예제로 실행 하였는데 Tab과 Button까지는 만들어 졌는데 Button를 Click해도 Msg가 나오질 않습니다.
어떻게 하면 되는지요?
예제는 매크로 사용하는 것으로 설정해야 작동합니다. 매크로 사용하는 것으로 설정했는지 확인해 보세요.
리본에 추가하는 것은 샘플 문서로부터 추출한 문서를 편집해서 잘 됐습니다.
빠른 실행 도구 모음에 추가하는 것도 혹시 가능할까요?
사용자 지정 내보내기로 만든 파일을 참조해서 아래와 같이 추가해봤는데..
어디에서 에러인지 리본메뉴까지 뜨지 않는 현상이 발생하네요..
엑셀 리본메뉴에서 다음 순서로 해 보세요.
파일 > 옵션 > 왼쪽 메뉴에서 빠른실행도구모음 > 명령선택 리스트 박스 클릭 > "모든명령"선택 > "미리보기 버튼을 클릭하면 메시지가..."을 선택하여 "추가"버튼 클릭 > 확인
**주의 : 모든명령 선택하면 보이는 버튼들은 버튼이름이 아니라 버튼의 설명이 나타나므로 "미리보기 버튼을 클릭하면 메시지가..."이 나타납니다.
엑셀 2019 버전을 사용하고 있습니다. 설명주신 대로 몇번을 해보았는데 파일에 문제가 있다고
복구하겠냐는 메시지가 나오고 파일이 손상되어 열거나 복구할 수 없다는 메시지가 나오네요.
다른 분들은 이 순서대로 하면 잘된다고 하는데요, 혹시 모르니... 중간에 zip프로그램을 닫지 않았는지 확인부탁드립니다.