사용자 리본 만들기

노만e가 엑셀 리본 메뉴를 만드는 방법

노만e 2025. 3. 24. 22:42

 

하루에 3시간씩 걸리는 반복적인 업무를 최소 20%씩만 절약해도한 달이면 12시간 이상을 절약할 수 있습니다어떻게 하면 업무 생산성을 높일 수 있을까요해답은 사용자 리본 메뉴 만들기에 있습니다사용자 리본 메뉴에 자주 사용하는 메뉴와 매크로를 배치하고매크로에 단축키를 만들어 사용한다면매일 반복하는 수작업으로부터 받던 고통에서 벗어날 수 있습니다그럼 리본 메뉴 만드는 방법에 대해 알아보겠습니다. 

1. Excel 추가기능 파일(.xlam) 만들기
2. 나만의 리본 메뉴 만들기
3. 엑셀 추가기능 (Addin) 설치 하기
4. 리본 메뉴 편집
5. 매크로 작성
6. 매크로 단축키 만들기

 

1 Excel 추가기능 파일(.xlam) 만들기

1. Excel 통합문서를 만듭니다. 내용은 입력하지 않습니다.

2. 다른 이름으로 저장 단축키 F12를 누르고, [파일 형식][Excel 97-2003 추가 기능] 선택하고, [파일 이름]Custom_Ribbon_Sample로 통합문서를 저장합니다.

 

 

2 나만의 리본 메뉴 만들기

1. 엑셀파일의 customUI14.xml을 손쉽게 변경하기 위해서는 Office RibbonX Editor를 다운받아서 사용합니다. 아래 사이트에 접속하여 최신 릴리즈 버전을 다운로드 합니다.

https://github.com/fernandreu/office-ribbonx-editor/releases/tag/v1.9.0

 

2. 설치후 실행하면 다음과 같은 창이 뜹니다.

 

3. [Open] 버튼을 눌러, 좀전에 만들었던 Custom_Ribbon_Sample 파일을 선택후 [열기] 버튼을 누릅니다.

 

4. Custom_Ribbon_Sample.xlam에서 마우스 우클릭해서 [Insert Office 2010+ Custom UI Part] 선택합니다.

 

5. customUI14.xml을 더블클릭 합니다.

 

6. 우측 코드창에 아래의 XML 코드를 복사해 붙여 넣습니다. 코드의 세세한 부분까지는 알 필요가 없습니다. 여기에서는 리본 메뉴가 코드의 어느 부분에 해당 하는지 정도만 알면 됩니다.


<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<!-- 리본 사용자 정의 시작 -->
    <ribbon startFromScratch="false">
        <tabs>
             <tab id="CUSTAB" label="우공이산" insertBeforeMso="TabHome">
             <!-- '우공이산'이라는 사용자 정의 탭을 '홈' 탭 앞에 삽입 -->

                <group id="FileGroup" label="파일">
                <!-- '파일' 그룹 생성 -->
                    <control idMso="FileNewDefault" label="New" />
                    <!-- 새 파일 만들기 -->
                    <control idMso="FileOpenUsingBackstage" label="Open"/>
                    <!-- 파일 열기 -->
                    <control idMso="FileSave" label="Save"/>
                    <!-- 파일 저장 -->
                </group>

                <group id="FontsGroup" label="글꼴">
                <!-- '글꼴' 그룹 생성 -->
                    <box id="box01" boxStyle="horizontal">
                    <!-- 가로로 정렬된 상자 생성 -->
                        <comboBox idMso="Font" label=" "/>
                        <!-- 글꼴 선택 콤보 박스 -->
                        <comboBox idMso="FontSize" label=" "/>
                        <!-- 글꼴 크기 선택 콤보 박스 -->
                        <button idMso="FontSizeIncrease" label=" "/>
                        <!-- 글꼴 크기 증가 버튼 -->
                        <button idMso="FontSizeDecrease" label=" "/>
                        <!-- 글꼴 크기 감소 버튼 -->
                    </box>
                
                    <box id="box02" boxStyle="horizontal">
                    <!-- 두 번째 가로 정렬 상자 -->
                        <buttonGroup id="HFButtonGroup1">
                        <!-- 버튼 그룹 생성 -->
                        <control idMso="FormatPainter" label=" " />              
                        <!-- 서식 복사 버튼 -->

                        <toggleButton idMso="Bold" />
                        <!-- 굵게 토글 버튼 -->
                        <toggleButton idMso="Italic" />
                        <!-- 기울임꼴 토글 버튼 -->
                        <menu id="Udline00" imageMso="Underline">
                        <!-- 밑줄 메뉴 생성 -->
                            <control idMso="Underline" label="밑줄" />
                            <!-- 밑줄 -->
                            <control idMso="UnderlineDouble" label="이중 밑줄" />
                            <!-- 이중 밑줄 -->
                            <control idMso="Strikethrough" label="취소선" />
                            <!-- 취소선 -->
                        </menu>

                        <control idMso="FontColorPicker" label=" "/>
                        <!-- 글꼴 색상 선택기 -->
                        </buttonGroup>
                    </box>
                        
                    <box id="box03" boxStyle="horizontal">
                    <!-- 세 번째 가로 정렬 상자 -->
                        <splitButton idMso="MergeCenterMenu"/>
                        <!-- 병합 및 가운데 맞춤 스플릿 버튼 -->
                    </box>
                </group>
                
                <group id="CellsAlign" label="맞춤/셀 편집">
                <!-- '맞춤/셀 편집' 그룹 생성 -->
                    <button id="btn01" label="셀병합" onAction="MergeCell" imageMso="MergeCells"/> 
                    <!-- 셀 병합 버튼 -->
                    <button id="btn02" label="셀분할" onAction="unMergeCell" imageMso="UnmergeCells"/>
                    <!-- 셀 분할 버튼 -->
                    <button id="btn05" label="채우기" onAction="EmptyCellFill" imageMso="FillDown"/> 
                    <!-- 셀 채우기 버튼 -->
                </group>

                <group id="StyleGroup" label="스타일">
                <!-- '스타일' 그룹 생성 -->
                    <control idMso="ConditionalFormattingMenu" label="조건부" />
                    <!-- 조건부 서식 메뉴 -->
                    <control idMso="FormatAsTableGallery" label="표서식"/>
                    <!-- 표 서식 갤러리 -->
                    <control idMso="CellStylesGallery" label="셀서식"/>
                    <!-- 셀 서식 갤러리 -->
                </group>

                <group id="InsertGroup" label="삽입">
                <!-- '삽입' 그룹 생성 -->
                    <control idMso="ShapesInsertGallery" label="도형" />
                    <!-- 도형 삽입 갤러리 -->
                    <control idMso="ChartTypeAllInsertDialog" label="차트"/>
                    <!-- 차트 삽입 대화 상자 -->
                    <control idMso="TextBoxInsertHorizontal" label="글자" />
                    <!-- 텍스트 상자 삽입 -->

                    <control idMso="SymbolInsert" label="기호"/>
                    <!-- 기호 삽입 -->
                    <control idMso="AutoSumMenu" label="합계" />
                    <!-- 자동 합계 메뉴 -->
                    <button idMso="PivotTableSuggestion" label="피벗테이블" />
                    <!-- 피벗 테이블 버튼 -->
                </group>

                <group id="DataGroup" label="데이터">
                <!-- '데이터' 그룹 생성 -->
                    <control idMso="SortDialog" label="정렬" />
                    <!-- 정렬 대화 상자 -->
                    <control idMso="Filter" label="필터"/>
                    <!-- 필터 -->
                    <control idMso="AdvancedFilterDialog" label="고급"/>
                    <!-- 고급 필터 대화 상자 -->
                    <control idMso="DataValidation" label="유 효 성"/>
                    <!-- 데이터 유효성 검사 -->
                    <control idMso="QuickCode" label="빠른채우기"/>
                    <!-- 빠른 채우기 -->
                     
                    <menu id="DupMenu" label="중복찾기" size="normal" imageMso="DatasheetColumnLookup">
                    <!-- 중복 찾기 메뉴 -->
                        <control idMso="ConditionalFormattingHighlightDuplicateValues" label="중복 값 찾기(조건부 서식) " screentip="중복값 찾기" />
                        <!-- 조건부 서식을 통한 중복 값 찾기 -->
                        <control idMso="RemoveDuplicates" label="중복값 제거"  />
                        <!-- 중복 값 제거 -->
                    </menu>
                        
                   <button idMso="ConvertTextToTable" size="large" />
                   <!-- 텍스트를 표로 변환 버튼 -->
                   <menu idMso="SelectMenuExcel" size="large" /> 
                   <!-- 선택 메뉴 -->
                </group>

                <group id="ViewGroup" label="보기">
                <!-- '보기' 그룹 생성 -->
                    <gallery idMso="ViewFreezePanesGallery" size="large" />
                    <!-- 틀 고정 갤러리 -->
                    <toggleButton idMso="ViewNormalViewExcel" label="기본" />
                    <!-- 기본 보기 토글 버튼 -->
                    <toggleButton idMso="ViewPageBreakPreviewView" label="나눔" />
                    <!-- 페이지 나누기 미리 보기 토글 버튼 -->
                </group>

            </tab>
        </tabs>
    </ribbon>
<!-- 리본 사용자 정의 끝 -->
</customUI>

 

위의 코드를 간단히 설명하면, 

1. 탭: 우공이산 (CUSTAB)
  •  insertBeforeMso="TabHome"는 이 탭이 기본 홈 탭 앞에 삽입되도록 지정합니다.
  • 탭의 이름은 "우공이산"입니다.
2. 그룹: 파일 (FileGroup)
  • 이 그룹에는 새 파일 생성, 파일 열기, 파일 저장과 관련된 컨트롤이 포함됩니다.
  • FileNewDefault, FileOpenUsingBackstage, FileSave는 각각 새 파일 생성, 파일 열기, 파일 저장을 위한 기본 제공 컨트롤입니다.
3. 그룹: 글꼴 (CellsFont)
  • 글꼴과 관련된 설정을 할 수 있는 그룹입니다.
  • 글꼴 종류 선택, 글꼴 크기 증가/감소, 굵게, 기울임, 밑줄, 이중 밑줄, 취소선, 글꼴 색상 등의 컨트롤이 포함되어 있습니다.
  • menu 요소를 사용하여 밑줄, 이중 밑줄, 취소선을 하나의 드롭다운 메뉴로 묶었습니다.


4. 그룹: 스타일 (SheetsStyle)
  • 조건부 서식, 표 서식, 셀 서식 등을 설정할 수 있는 컨트롤이 포함됩니다.
  • ConditionalFormattingMenu, FormatAsTableGallery, CellStylesGallery는 각각 조건부 서식, 표 서식, 셀 서식을 위한 기본 제공 컨트롤입니다.


5. 그룹: 삽입 (InsertObjects)
  •  도형, 차트, 글자, 기호, 합계, 피벗 테이블 등의 삽입과 관련된 컨트롤이 포함됩니다.
  • ShapesInsertGallery, ChartTypeAllInsertDialog, TextBoxInsertHorizontal, SymbolInsert, AutoSumMenu, PivotTableSuggestion은 각각 도형, 차트, 텍스트 상자, 기호, 합계, 피벗 테이블 삽입을 위한 컨트롤입니다.


6. 그룹: 데이터 (Data)
 데이터 정렬, 필터링, 고급 필터

 

6. 저장후, 닫기 버튼을 누릅니다.

 

7. Custom_Ribbon_Sample.xlam 파일을 더블클릭하여 열면, [우공이산] 탭이 생성된 걸 볼 수 있습니다.

 

 

3 엑셀 추가기능 (Addin) 설치 하기

 

1. 다운로드 파일 [차단 해제] 활성화 : 첨부파일 다운받은 경우 해당됨.

20223월 윈도우 업데이트 이후, 인터넷에서 다운받은 파일은 보안문제로 매크로가 차단되어 있으므로 '차단 해제'를 체크하여 매크로를 활성화 해야 합니다. 다운받은 파일을 마우스 우클릭 - 속성으로 이동한 후, 오른쪽 아래 [차단 해제]를 활성화 합니다.

 

2. 파일 탐색기의 주소 표시줄에 "%appdata%\Microsoft\AddIns" 따옴표안의 문자열을 복사/붙여넣기 하면 추가기능 폴더로 이동합니다. 만들었던 추가기능파일을 해당 폴더로 옮겨 주세요.

 

3. 엑셀에서 [파일] - [옵션] 으로 이동한 후, [추가기능] 탭으로 이동합니다. 아래에서 'Excel 추가기능'을 선택 후, [이동] 버튼을 클릭하면 추가기능을 선택할 수 있습니다.

 

4. [찾아보기]를 클릭한 후, 다운로드 받은 추가기능을 선택하고, [확인] 버튼을 누릅니다.

 

5. [확인] 버튼을 누르면, 추가기능이 목록에 추가됩니다.

 

추가기능 제거하는 방법은 아래와 같이 제거하고자 하는 추가기능을 선택해제 한뒤, [확인] 버튼을 눌러 제거합니다.

 

4 리본 메뉴 편집

 

1. 리본 메뉴의 구성

 

2. XML 태그간의 관계

 

2. XML 기본지식

1. XML문은 대소문자를 구분합니다.
 
2. <ribbon startFromScratch="false"> : startFromScratch 속성은 리본 메뉴의 탭을 표시할지
여부를 결정합니다. 여기에서 false기존 tab이 보이게, true기존 tab 안 보이게 합니다.
 
3. idMsoExcel에서 사용되는 RibbonIDRibbon 탭에서 특정 명령을 식별하는 데
사용되는 고유 식별자입니다. 18페이지에 idMso값 쉽게 알아내기방법과 참고 사이트
적어 놓았습니다.
 
4. imageMsoOffice의 내장 아이콘을 의미합니다.
 
5. id는 중복되어서는 안되며, 첫 글자는 반드시 문자여야 합니다.
 
6. 이미지의 크기는 보통 이미지(size=“narmal”), 큰 이미지(size=“large”)로 구분합니다.
 
7. <group idMso=“GroupEditingExcel” visible=“False”/> visible 속성을 이용해 편집그룹을
숨길 수도 있습니다.

8. 원하는 명령 비활성화

- enabled=“False”하면 비활성화, enabled=“True”하면 활성화 시킬 수 있습니다.
 
9. 컨트롤의 종류는 control, button, box, comboBox, toggleButton, splitButton, menu,
gallery등이 있습니다. 우리는 control button 정도만 알아도 충분합니다.

 

3. tab 이름

tab 이름 설명
TabHome
TabInsert 삽입
TabPageLayoutExcel 페이지 레이아웃
TabFormulas 수식
TabData 데이터
TabReview 검토
TabView 보기
TabDeveloper 개발 도구

 

4. tab 수정


<ribbon startFromScratch="false">
<tabs>
<tab id="CUSTAB" label="우공이산" insertBeforeMso="TabHome">
<!-- '우공이산'이라는 탭을 만들고 기본 '' 탭 앞에 위치시킴 -->
</tab>
</tabs>
</ribbon>
</customUI>
-------------------------------------------------------------------------------
tab이름위치를 변경할 수 있습니다.
[tab id]는 사용자가 임의로 지정 가능하며, 고유한 번호로 중복되면 안 됩니다.
label 속성은 탭에 표시될 문자열입니다.
insertBeforeMso 속성은 탭의 위치를 지정 할 때 사용합니다. 위의 tab 이름을 참조하여
탭의 삽입 위치를 변경할 수 있습니다.
 
insertBeforeMso="TabHome“
insertAfterMso="TabHome“

 

5. group 수정


<ribbon startFromScratch="false">
<tabs>
<tab id="CUSTAB" label="우공이산" insertBeforeMso="TabHome">
<group id="FileGroup" label="파일">
<control idMso="FileNewDefault" label="New" />
</group>
 
<group id="FontsGroup" label="글꼴">
<comboBox idMso="Font" label=" "/>
</group>

<group id="StyleGroup" label="스타일">
<control idMso="ConditionalFormattingMenu" label="조건부" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
-------------------------------------------------------------------------------
임의로 원하는 이름의 group을 생성할 수 있으며, group내 명령버튼을 추가 할 수 있습니다.
[group id]는 고유한 번호로 다른 group 태그의 id와 중복될 수 없습니다.
label 속성은 group에 표시될 문자열입니다.
group 태그내에 control, button 태그를 추가해 원하는 명령을 추가할 수 있습니다.

 

6. 기본 메뉴의 group

Tab Control Name 설명

(TabHome)
GroupClipboard 클립보드
GroupFont 글꼴
GroupAlignmentExcel 맞춤
GroupNumber 표시형식
GroupStyles 스타일
GroupCells
GroupEditingExcel 편집
삽입
(TabInsert)
GroupInsertTablesExcel
GroupInsertIllustrations 일러스트레이션
GroupOfficeExtension
GroupInsertChartsExcel 차트
GroupPowerMap 보고서
GroupSparklinesInsert 스파크라인
GroupSlicerInsert 필터
GroupInsertLinks 링크
GroupInsertText 텍스트
GroupInsertSymbols 기호
페이지 레이아웃
(TabPageLayoutExcel)
GroupThemesExcel 테마
GroupPageSetup 페이지 설정
GroupPageLayoutScaleToFit 크기 조정
GroupPageLayoutSheetOptions 시트 옵션
GroupArrange 정렬
수식
(TabFormulas)
GroupFunctionLibrary 함수 라이브러리
GroupNamedCells 정의된 이름
GroupFormulaAuditing 수식 분석
GroupCalculation 계산
데이터
(TabData)
GroupGetExternalData 외부 데이터 가져오기
GroupPowerQueryData 쿼리
GroupConnections 연결
GroupSortFilter 정렬 및 필터
GroupDataTools 데이터 도구
GroupForecast 예측
GroupOutline 윤곽선
검토
(TabReview)
GroupProofing 언어 교정
GroupLanguage 언어
GroupComments 메모
GroupChangesExcel 변경 내용
GroupInk 잉크
보기
(TabView)
GroupWorkbookViews 통합 문서 보기
GroupViewShowHide 표시형식
GroupZoom 확대/축소
GroupWindow
GroupMacros 매크로
개발도구
(TabDeveloper)
GroupCode 코드
GroupAddins 추가 기능
GroupControls 컨트롤
GroupXml XML

 

 

7. control 수정 또는 button 추가

<ribbon startFromScratch="false">
<tabs>
<tab id="CUSTAB" label="우공이산" insertBeforeMso="TabHome">
<group id="CellsAlign" label="맞춤/셀 편집">
<control idMso="AlignCenter" label=" "/> -------
<button id="btn01" label=" " onAction="unMergeCell" imageMso="UnmergeCells"/> --------------------------------------
</group>
</tab>
</tabs>
</ribbon>
</customUI>
-------------------------------------------------------------------------------
control
idMsoExcel에서 사용되는 RibbonIDRibbon 탭에서 특정 명령을 식별하는 데
사용되는 고유 식별자입니다.
아래 참고 사이트“idMso값 쉽게 알아내기 방법을 통해 원하는 도구모음을 찾아
idMso=" " 쌍따옴표 안에 넣으면 도구모음이 추가 됩니다.
labelcontrol 옆에 표시될 문자열입니다.
 
button
id는 고유한 번호로 다른 button id와 중복될 수 없습니다.
labelbutton 옆에 표시될 문자열입니다.
onAction은 버튼 클릭시 실행할 매크로명 입니다.
imageMsoOffice에 내장된 아이콘 이미지입니다. 아래 참고 사이트에서 매크로를 대표
할 만한 아이콘 이미지를 찾아 imageMso=" " 쌍따옴표 안에 넣으면, 리본 메뉴아이콘
이미지가 표시됩니다.
 
controlbutton의 차이점
control은 엑셀 리본에 이미 존재하는 제어항목(복사, 잘라내기, 붙여넣기등)을 사용자 리본
메뉴에 추가할 때 사용 합니다.
button은 엑셀 리본에 없는 새로운 기능을 추가하고 싶을 때 사용합니다.

 

8. idMso값 쉽게 알아내기

idMso값을 알아 내는 방법중 하나는 ‘Excel 옵션리본 사용자 지정탭을 이용하는 방법입니다. 엑셀에서 [파일] - [옵션] 으로 이동한 후, [리본 사용자 지정] 탭으로 이동합니다. [명령 선택] 리스트에서 모든 탭을 선택하고, 명령에 마우스 커서를 가져다 놓으면 풍선 도움말에 영어 이름이 표시되는데, 이 이름이 idMso 값입니다.

idMso 참고 사이트

https://github.com/OfficeDev/office-fluent-ui-command-identifiers/blob/main/Office%202016/excelcontrols.xlsx

 

 

imageMso 참고 사이트

https://bert-toolkit.com/imagemso-list.html

https://codekabinett.com/download/Microsoft-Office-2016_365-imageMso-Gallery.pdf

 

5 매크로 작성

 

1. Button 추가 : 아래 XML코드는 [맞춤/셀 편집] 그룹에 imageMso를 통해 아이콘 이미지를 표시하고, 버튼 클릭시 해당 매크로가 실행되도록 하는 코드입니다.

<group id="CellsAlign" label="맞춤/셀 편집">
<button id="btn01" label="셀병합" onAction="MergeCell" imageMso="MergeCells"/>
<button id="btn02" label="셀분할" onAction="unMergeCell" imageMso="UnmergeCells"/>

<button id="btn05" label="채우기" onAction="EmptyCellFill" imageMso="FillDown"/>
</group>

 

 

2. 매크로 작성

(1) Custom_Ribbon_Sample.xlam 파일을 더블클릭하여 실행 시킨후, [개발 도구] -[코드] 그룹-[Visual Basic]을 클릭합니다. 또는 단축키 "Alt + F11"을 누릅니다. [Visual Basic 편집기] 창이 표시 됩니다.

 

(2) [Visual Basic 편집기] 창에서 [삽입] - [모듈]을 눌러 모듈을 삽입합니다.

 

(3) 코드 입력창에 아래의 코드를 붙여 넣습니다. XML코드에서 사용한 매크로 명과 동일하게 작성하여야 하며, 매크로명 옆에 “(control As IRibbonControl)”를 꼭 적어야 합니다.

Sub unMergeCell(control As IRibbonControl)  '셀분할하는 프로시저로 리본 컨트롤과 연동
    Dim rTable As Range, rng As Range   '변수 선업
    
    On Error Resume Next                    '에러 발생 시 무시하고 코드 진행
    
    Set rTable = Selection                  '선택 영역을 범위 객체에 저장
    rTable.HorizontalAlignment = xlCenter   '선택 영역의 가운데 정렬
    rTable.UnMerge                          '선택 영역의 병합 해제
    
    For Each rng In rTable.Cells            '선택영역의 모든 셀을 반복 실행
        If IsEmpty(rng) Then rng = rng.Offset(-1).Value '셀이 비어 있으면 위쪽 셀 값으로 채움
    Next rng

End Sub

Sub MergeCell(control As IRibbonControl) '셀병합하는 프로시저로 리본 컨트롤과 연동
    Dim rX As Range     '변수 선업
    Dim rMerge As Range, rY As Range
    Dim ix As Long, i As Long
    Dim prng()
    Dim rTable As Range
    Application.DisplayAlerts = False   '경고 메시지 표시하지 않도록 설정
    On Error Resume Next    '에러 발생 시 무시하고 코드 진행
    Set rTarget = Selection         '선택 영역을 범위 객체에 저장
    rTarget.HorizontalAlignment = xlCenter  '선택 영역의 가운데 정렬 설정
    For Each rY In rTarget.Columns      '선택영역의 모든열 반복
     ix = ix + 1    '열 번호 변수에 1을 더함
         If ix = 1 Then '첫 번째 열 처리
            For Each rX In rY.Cells '루프를 통하여 현재 열의 각 셀 처리
                    If rMerge Is Nothing Then '병합할 범위가 비어있다면
                          Set rMerge = rX   '병합할 범위 객체 초기 설정
                      Else
                          If rX = rMerge.Cells(rMerge.Cells.Count) Then
                              Set rMerge = rMerge.Resize(rMerge.Cells.Count + 1) '같은 열에 있는 연속된 셀이면 병합 범위 확장
                          Else
                              rMerge.Merge      '연속된 셀이 아니면 현재 셀까지 병합 후 다시 시작
                              Set rMerge = rX
                          End If
                      End If
            Next rX
             rMerge.Merge   '현재 열의 병합 실행
            For Each rng In rY.Cells '선택영역의 모든셀 반복
                If rng.MergeCells And rng.Address = rng.MergeArea.Cells(1, 1).Address Then '병합된 셀이고, 병합된 영역의 첫 번째 셀이라면
                    i = i + 1       '배열 인덱스 증가 및 배열 재할당
                    ReDim Preserve prng(1 To i)
                    Set prng(i) = rng.MergeArea '병합 영역 정보를 배열에 저장
                End If
            Next rng
            Set rMerge = Nothing '현재 열의 병합 초기화
        Else    '첫 번째 열 이외의 열 처리
            For i = 1 To UBound(prng)
               Set rTable = prng(i).Offset(, ix - 1).Resize(prng(i).Rows.Count, 1) '현재 열에서 병합 영역의 위치 계산 및 범위 객체 생성
                    For Each rX In rTable   '루프를 통하여 계산된 범위의 각 셀 처리
                         If rMerge Is Nothing Then
                             Set rMerge = rX    '병합할 범위 객체 초기 설정
                         Else
                             If rX = rMerge.Cells(rMerge.Cells.Count) Then
                                 Set rMerge = rMerge.Resize(rMerge.Cells.Count + 1) '같은 열에 있는 연속된 셀이면 병합 범위 확장
                             Else
                                 rMerge.Merge   '연속된 셀이 아니면 현재 셀까지 병합 후 다시 시작
                                 Set rMerge = rX
                             End If
                         End If
                  Next
            rMerge.Merge    '현재 열의 병합 실행
            Next i
        End If
    Next rY
    Application.DisplayAlerts = True
End Sub


Sub EmptyCellFill(control As IRibbonControl)    '빈 셀을 채우는 프로시저로 리본 컨트롤과 연동
    Dim rng As Range    '변수 선업
    Dim rCol As Range
    Dim rTable As Range
    Dim rng_old
    On Error Resume Next                '에러 발생 시 무시하고 코드 진행
    Set tTable = Selection              '선택 영역을 범위 객체에 저장
    For Each rCol In tTable.Columns '선택영역의 모든열 반복
        For Each rng In rCol.Cells '각 열에 있는 모든셀 반복
            
            If IsEmpty(rng) Then    '셀이 비어 있는지 확인
                rng.Value = rng_old '셀이 비어 있으면 이전 값 복사
                Else
                rng_old = rng.Value '비어 있지 않으면 현재 값을 이전 값으로 저장
            End If
        Next rng
    Next rCol
    rTable.Cells(1).Select '선택 영역의 첫 번째 셀 선택
End Sub

 

(4) [저장] 버튼을 클릭, [닫기] 버튼을 클릭하여 창을 닫습니다.

 

(5) 명령 버튼 정상동작 확인

  • 셀병합 : 병합할 범위를 선택후, [셀병합] 버튼을 클릭하면, 같은 팀끼리 병합되는 작업이 실행 됩니다.

 

  • 셀분할 : 병합된 범위를 선택후, [셀분할] 버튼을 클릭하면, 병합된 셀이 해제 되고, 빈 셀에 데이터가 있는 윗셀의 값으로 채워지는 작업 실행됩니다.

 

  •  채우기 : 팀필드에서 범위를 선택후, [채우기] 버튼을 클릭하면, 빈 셀에 데이터가 있는 윗셀의 값으로 채워지는 작업이 실행 됩니다.

 

6 매크로 단축키 만들기

 

1. [Visual Basic 편집기] 창에서 [삽입]-[모듈]을 눌러 모듈을 삽입합니다.

 

2. 코드 입력창에 아래의 코드를 복사/붙여 넣습니다. 혹시 단축키로 만들고 싶은 매크로가 있다면, 아래 표시된 부분에 단축키와 매크로를 넣으세요.

Sub Auto_open()                      '파일이 열릴 때 실행되는 프로시저입니다.
    With Application
        .OnKey "+~", "AddRow"        'Shift + Enter키 동시 누르면, 행삽입 매크로 “AddRow” 실행
        .OnKey "+{ENTER}", "AddRow"  'Shift + Enter키 동시 누르면, 행삽입 매크로 “AddRow” 실행
        .OnKey "+{BS}", "DelRow"     'SHIFT + 백스페이스키 동시 누르면, 행삭제 매크로 “DelRow” 실행
    End With
End Sub

Sub AddRow()
     If Application.CutCopyMode = xlCopy Then       '현재 복사모드인지 확인
        Application.CutCopyMode = False             '복사모드라면 복사모드 해제
        Selection.EntireRow.Insert                  '선택 영역의 전체 행 삽입
    Else                                            '복사모드가 아니라면
        Selection.EntireRow.Insert                  '선택 영역의 전체 행 삽입
    End If
End Sub

Sub DelRow()
    Dim YesNo As Integer
    On Error Resume Next                                                    'VBA 코드 진행 중 에러 발생 시 무시하고 코드 진행
     If Application.WorksheetFunction.CountA(Selection.EntireRow) > 0 Then  '선택된 행에 데이터가 있는지 확인
        YesNo = MsgBox("행에 내용이 있습니다. 그래도 지울까요", vbYesNo)    '데이터가 있다면 사용자 확인 메시지 출력
        If YesNo = 6 Then                                                   '사용자가 "예"를 선택하면 행 삭제
            Selection.EntireRow.Delete
        Else                                                                '아니오"를 선택하면 매크로 종료
            Exit Sub
        End If
    Else
      Selection.EntireRow.Delete                                            '선택된 행에 데이터가 없으면 바로 삭제
    End If
 End Sub

 

※  Onkey 메서드

Onkey 메서드는 Application 개체에 사용하는 메서드로, 특정키에 대한 기능 정의, 새로운 기능 정의 또는 기능 해지 할때 사용합니다.

Onkey 메서드 형식
Application.Onkey(키조합, 매크로명)
Key Code Key Code
BACKSPACE {BACKSPACE} or  {BS} LEFT ARROW {LEFT}
BREAK {BREAK} NUM LOCK {NUMLOCK}
CAPS LOCK {CAPSLOCK} PAGE DOWN {PGDN}
CLEAR {CLEAR} PAGE UP {PGUP}
DELETE or DEL {DELETE} or  {DEL} RETURN {RETURN}
DOWN ARROW {DOWN} RIGHT ARROW {RIGHT}
END {END} SCROLL LOCK {SCROLLLOCK}
ENTER (숫자패드) {ENTER} TAB {TAB}
ENTER ~ (tilde) UP ARROW {UP}
ESC { ESCAPE} or  {ESC} F1 ~ F15 {F1} ~ {F15}
HELP {HELP} Shift +
HOME {HOME} Ctrl ^
INS {INSERT} Alt %

 

3. 예제

Application.Onkey"+~", "AddRow" : Shift+Enter 누르면, “AddRow” 프로시저 실행

Application.OnKey "^{p}", "" : Ctrl+P의 기능을 해지

Application.OnKey "^{p}" : Ctrl+P의 원래 기능으로 사용할 수 있도록 기능 복원

 

지금까지 추가기능 파일 만들기, Office RibbonX Editor를 통한 리본 메뉴 편집, [Visual Basic 편집기]에서 매크로 만들기, 매크로 단축키 만들기까지 리본 메뉴 만드는 모든 기능을 배웠습니다. 이제 여러분이 할 일은 매일 반복되는 수많은 수작업을 어떻게 하면 자동화할 수 있는지 고민하고, 매크로로 만들어 리본 메뉴에 등록하는 일입니다.

 

Custom_Ribbon_Sample.xlam
0.03MB