• 최초 작성일: 2002-07-03
  • 최종 수정일: 2026-09-30
  • 조회수: 11 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 자동감지 메뉴 만들기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

지난 VB0163 강좌 시간에 '자동감지 도구모음' 이란 것을 만들어 보았지요? 이번 시간에는 비슷한(하지만 다른…) 것을 하나 만들어 보도록 하겠습니다. 이름하야 '자동감지 메뉴' 만들기 랍니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

자동감지 메뉴 만들기

핵심 요약: 자동감지 메뉴

워크북의 Open, Activate, Deactivate, BeforeClose 이벤트에 메뉴 추가, 표시, 숨김, 삭제 프로시저를 연결하면 해당 파일이 활성화될 때만 메뉴가 나타납니다.

  • 1단계: Workbook_Open 이벤트에서 AddMenu를 호출해 메뉴를 만듭니다.
  • 2단계: Activate와 Deactivate 이벤트에서 메뉴를 보이거나 숨깁니다.
  • 3단계: BeforeClose 이벤트에서 메뉴를 삭제합니다.

Step 1: 자동감지 메뉴란?

오늘 강좌 파일을 탁 열었을 때 화면 상에 뭐 달라진 것이 없었나요? 눈썰미가 있는 분은 알아차리셨을텐데… 힌트를 좀 드리자면, 메뉴바를 자세히 살펴보세요… 이제 발견하셨겠지요?

예제 파일을 열면 메뉴 표시줄의 '창' 메뉴 왼쪽에 '나의 메뉴'라는 메뉴가 하나 생깁니다.

메뉴 표시줄에 나의 메뉴가 추가된 모습
아이엑셀러

그런데 재미있는 것이, 오늘 강좌 파일이 활성화 되어 있을 때에는 '나의 메뉴' 라는 메뉴가 나타나지만 다른 워크북 파일을 선택하게 되면 사라지게 된다는 것입니다. 다시 강좌 파일을 선택하면 '나의 메뉴'가 또다시 나타나고…

이것은 Workbook 오브젝트의 여러 가지 이벤트를 이용하면 가능합니다.

참고: 이 예제의 메뉴는 Excel 2003 이전의 CommandBars 방식입니다. Excel 2007 이후 버전에서는 사용자 정의 메뉴가 '추가 기능' 탭 아래에 표시됩니다.

Step 2: 워크북 이벤트에 프로시저 연결하기

(1) VB Editor 상태에서 Workbook 오브젝트의 Open 이벤트를 선택하고 AddMenu 라고 입력합니다. AddMenu라는 것은 물론 프로시저 이름으로서 이 코드에 대해서는 뒤에서 설명합니다.

VB Editor에서 ThisWorkbook의 Workbook_Open 이벤트에 AddMenu를 입력한 화면
아이엑셀러

(2) 마찬가지 방법으로 워크북 오브젝트의 BeforeClose, Activate, Deactivate 이벤트 핸들러 프로시저를 추가하고 아래와 같이 각 이벤트별로 수행시킬 프로시저명을 적습니다. 이름에서 알 수 있듯이 BeforeClose는 현재 파일을 종료하기 전에 실행하게 되는 이벤트, Activate와 Deactivate 이벤트는 현재 파일이 활성화 또는 비활성화 될 때마다 발생하게 되는 이벤트입니다.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    DeleteMenu
End Sub

Private Sub Workbook_Activate()
    ShowMenu
End Sub

Private Sub Workbook_Deactivate()
    HideMenu
End Sub

Step 3: 메뉴를 추가하는 AddMenu 프로시저

(3) (1)에서 호출한 AddMenu 프로시저를 작성합니다. 이 부분이 오늘의 핵심이 되는 것입니다. 이 프로시저는 이벤트 프로시저가 아니고 일반 프로시저입니다. 따라서 '삽입-모듈' 메뉴를 선택하여 일반 모듈시트를 한장 삽입한 다음 여기다가 아래와 같은 코드를 작성합니다.

Sub AddMenu()
    Dim cmdNewMenu As CommandBarPopup
    Dim cmdHelpMenu As CommandBarPopup
    Dim MenuItem As CommandBarControl
    Dim SubMenuItem As CommandBarControl
    ' 커맨드 바 팝업 오브젝트와 커맨드 바 컨트롤 개체를 선언해 주었습니다.
    ' 사용자 정의 메뉴에 대한 기본적인 사항은 VB0117 강좌를 참고하시기 바랍니다.

    Set cmdHelpMenu = CommandBars(1).FindControl(ID:=30009)
    ' FindControl 메서드를 사용하여 메뉴 중에서 '도움말' 메뉴의 위치를 찾습니다.
    ' "그렇다면 도움말 메뉴의 ID 번호가 30009라는 것은 어떻게 알 수 있나요?"
    ' 하는 의문이 드시지요?
    ' 엑셀의 커맨드 바 컬렉션 오브젝트의 각 구성 요소는 ID Property라고 하는 고유의
    ' 번호를 붙여 관리를 합니다. ID Property의 전체 목록을 보시려면 아래의 Microsoft
    ' KnowledgeBase 게시물(Q159466)을 참고하세요.


    If cmdHelpMenu Is Nothing Then
    ' 만약  도움말 메뉴가 없다면 메뉴 바의 마지막에 추가를 하고, 도움말 메뉴가 있으면
    ' 그 앞에 사용자 정의 메뉴를 추가합니다.

        Set cmdNewMenu = CommandBars(1).Controls.Add _
          (Type:=msoControlPopup, temporary:=True)
    Else
        Set cmdNewMenu = CommandBars(1).Controls.Add _
          (Type:=msoControlPopup, before:=cmdHelpMenu.Index, _
          temporary:=True)
    End If

    ' 메뉴와 하위 메뉴를 추가하는 부분은 VB0117 강좌와 크게 다르지 않을 것입니다.
    cmdNewMenu.Caption = "나의 메뉴(&M)"
    Set MenuItem = cmdNewMenu.Controls.Add(Type:=msoControlButton)
    With MenuItem
        .Caption = "Sub Menu1"
        .OnAction = "SubMenu"
    End With

    Set MenuItem = cmdNewMenu.Controls.Add(Type:=msoControlButton)
    With MenuItem
        .Caption = "Sub Menu2"
        .OnAction = "SubMenu"
    End With

    Set MenuItem = cmdNewMenu.Controls.Add(Type:=msoControlButton)
    With MenuItem
        .Caption = "Sub Menu3"
        .OnAction = "SubMenu"
    End With
End Sub

메뉴에 연결한 SubMenu 프로시저는 다음과 같이 간단히 작성할 수 있습니다.

Sub SubMenu()

    MsgBox Application.CommandBars.ActionControl.Caption & " 메뉴를 선택하였습니다", , "www.iExceller.com"
    ' 클릭한 메뉴의 캡션을 알려 주는 간단한 프로시저입니다.

End Sub

Step 4: 메뉴 삭제·표시·숨기기

(4) (2) 단계에서 호출한 세 개의 프로시저는 다음과 같습니다. '나의 메뉴'라고 하는 사용자 정의 메뉴를 삭제/나타내기/숨기기 하는 프로시저로 별로 설명이 필요없을 것입니다.

Sub DeleteMenu()
    On Error Resume Next

    CommandBars(1).Controls("나의 메뉴(&M)").Delete
End Sub

Sub ShowMenu()
    On Error Resume Next

    CommandBars(1).Controls("나의 메뉴(&M)").Visible = True
End Sub

Sub HideMenu()
    On Error Resume Next

    CommandBars(1).Controls("나의 메뉴(&M)").Visible = False
End Sub

오늘은 여기까지…

정리 — 자동감지 메뉴 핵심 코드

구분 사용한 코드 역할
파일 열 때 Workbook_Open → AddMenu 메뉴 생성
활성화 Workbook_Activate → ShowMenu 메뉴 표시
비활성화 Workbook_Deactivate → HideMenu 메뉴 숨김
닫기 전 Workbook_BeforeClose → DeleteMenu 메뉴 삭제
위치 찾기 CommandBars(1).FindControl(ID:=30009) 도움말 메뉴 찾기

자주 묻는 질문 (FAQ)

Q1. 다른 파일로 이동하면 메뉴가 사라지게 하려면 어떻게 하나요?

Workbook_Deactivate 이벤트에서 메뉴의 Visible을 False로, Workbook_Activate 이벤트에서 True로 지정합니다.

Q2. 도움말 메뉴의 위치는 어떻게 찾나요?

CommandBars(1).FindControl(ID:=30009)로 도움말 메뉴를 찾아 그 앞에 새 메뉴를 추가합니다. 각 컨트롤의 ID 번호는 Microsoft 지식 베이스 문서(Q159466)에 정리되어 있습니다.

Q3. 파일을 닫을 때 메뉴는 어떻게 되나요?

BeforeClose 이벤트에서 DeleteMenu를 호출해 삭제합니다. 임시(temporary) 메뉴로 만들었으므로 엑셀을 닫으면 사라지기도 합니다.

마치며

워크북 이벤트를 조합하면 파일에 따라 알맞은 메뉴가 나타나도록 세밀하게 제어할 수 있습니다.