• 최초 작성일: 2002-06-12
  • 최종 수정일: 2026-09-30
  • 조회수: 9 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 자동감지 도구모음 만들기

들어가기 전에

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

이번 시간에는 아주 재미있는 것을 하나 살펴보도록 하겠습니다. John Walkenbach님의 아이디어를 응용한 것으로 "자동감지 도구모음"이라는 이름을 붙여 보았습니다.

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

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

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


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

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

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

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

자동감지 도구모음 만들기

핵심 요약: 자동감지 도구모음

셀 포인터가 지정한 영역에 들어오면 도구모음이 나타나고 벗어나면 사라지도록 SelectionChange 이벤트와 Union 메서드를 이용합니다.

  • 1단계: Workbook_Open에서 CommandBars.Add로 도구모음과 버튼을 만듭니다.
  • 2단계: 버튼의 OnAction에 Offset으로 셀을 이동하는 프로시저를 연결합니다.
  • 3단계: SelectionChange에서 Union으로 영역 포함 여부를 확인해 Visible을 전환합니다.

Step 1: 자동감지 도구모음이란?

아래의 테이블 중 아무 셀이나 클릭해 보세요. '자동감지 도구모음' 이라는 도구모음이 나타나며 각 아이콘을 클릭하면 셀 포인터가 지정한 방향으로 이동할 것입니다.

자동감지 도구모음 - 상하좌우로 한 칸씩 이동하는 아이콘 4개와 세 칸씩 이동하는 아이콘 4개
아이엑셀러

왜 '자동감지'라고 하였는지 이해하시겠지요?

어떻게 만들었는지 살펴보도록 합시다.

참고: 이 예제의 CommandBars는 Excel 2003 이전의 메뉴·도구모음 방식입니다. Excel 2007 이후 버전에서는 새로 만든 도구모음이 '추가 기능' 탭에 표시됩니다.

Step 2: 도구모음 만들기

(1) Workbook 오브젝트의 Open 이벤트 프로시저를 사용하여 파일이 열릴 때마다 CreateToolbar 프로시저가 실행되도록 합니다.

Private Sub Workbook_Open()
    CreateToolbar
End Sub

(2) 위에서 호출한 CreateToolbar 프로시저의 내용을 살펴보면…

Sub CreateToolbar()
    Dim barAutoSense As CommandBar
    Dim btnButton As CommandBarButton
    Dim i As Integer
    DeleteToolbar
    Set barAutoSense = CommandBars.Add
    ' 일단 빈 도구 모음을 하나 만듭니다.

    For i = 1 To 4
        Set btnButton = barAutoSense.Controls.Add(msoControlButton)
        ' 빈 도구모음에 아이콘(msoControlButton)을 4개 채워 넣습니다.

        With btnButton
            .OnAction = "Button" & i
            ' OnAction 속성을 지정하여 아이콘을 클릭했을 때 실행할 프로시저를 지정하고…

            .FaceId = i + 37
            ' FaceId 속성을 지정하여 아이콘의 모양을 지정합니다.
            ' FaceId 번호에 따라 아이콘 모양이 달라집니다.

            Select Case i
                Case 1: .Caption = "한 칸 위로"
                Case 2: .Caption = "한 칸 오른쪽으로"
                Case 3: .Caption = "한 칸 아래로"
                Case 4: .Caption = "한 칸 왼쪽으로"
            End Select
        End With
    Next i

    For i = 1 To 4
        Set btnButton = barAutoSense.Controls.Add(msoControlButton)
        With btnButton
            .OnAction = "MyButton" & i
            .FaceId = i + 3273

            Select Case i
                Case 1: .Caption = "세 칸 위로": .BeginGroup = True
                Case 2: .Caption = "세 칸 아래쪽으로"
                Case 3: .Caption = "세 칸 왼쪽으로"
                Case 4: .Caption = "세 칸 오른쪽으로"
            End Select
        End With
    Next i

    barAutoSense.Name = "자동감지 도구모음"
End Sub

Step 3: 각 아이콘에 연결되는 프로시저

Offset 메서드를 이용하여 상하좌우 방향으로 이동하는 것이므로 그다지 어려운 내용은 없습니다.

Sub Button1()
    On Error Resume Next
    ActiveCell.Offset(-1, 0).Activate
End Sub

Sub Button2()
    On Error Resume Next
    ActiveCell.Offset(0, 1).Activate
End Sub

Sub Button3()
    On Error Resume Next
    ActiveCell.Offset(1, 0).Activate
End Sub

Sub Button4()
    On Error Resume Next
    ActiveCell.Offset(0, -1).Activate
End Sub

Sub MyButton1()
    On Error Resume Next
    ActiveCell.Offset(-3, 0).Activate
End Sub

Sub MyButton2()
    On Error Resume Next
    ActiveCell.Offset(3, 0).Activate
End Sub

Sub MyButton3()
    On Error Resume Next
    ActiveCell.Offset(0, -3).Activate
End Sub

Sub MyButton4()
    On Error Resume Next
    ActiveCell.Offset(0, 3).Activate
End Sub

Step 4: 셀 포인터의 위치를 감지하기

(4) 이번에는 SelectionChange 이벤트를 사용하여 셀 포인터가 이동했을 때 여전히 셀 포인터가 노란색 영역 내부에 있는 지 아니면 벗어났는 지를 매번 확인합니다.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    If Union(Target, [MyRange]).Address = [MyRange].Address Then
    ' 셀 포인터가 노란색 영역 내부에 위치해 있는 지를 파악하기 위해서 Union 메서드를
    ' 사용한 점을 눈여겨 보시기 바랍니다.

        CommandBars("자동감지 도구모음").Visible = True
    Else
        CommandBars("자동감지 도구모음").Visible = False
    End If
End Sub

셀 포인터가 노란색 영역(MyRange) 내부에 있는지 판단하기 위해 Union 메서드를 사용했습니다. 선택한 셀과 MyRange를 합친 영역의 주소가 MyRange의 주소와 같으면 영역 안에 있다는 뜻입니다.

Step 5: 파일을 닫을 때 도구모음 삭제하기

(5) 파일을 닫기 전에 변경 사항을 저장할 것인지 여부를 사용자로부터 받습니다.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim strMsg As String
    Dim intAnswer As Integer

    If Not Me.Saved Then
        strMsg = "변경된 내용을 " & Me.Name & " 파일에 저장할까요?"
        intAnswer = MsgBox(strMsg, vbQuestion + vbYesNoCancel)

        Select Case intAnswer
            Case vbYes
                Me.Save
            Case vbNo
                Me.Saved = True
            Case vbCancel
                Cancel = True
                Exit Sub
        End Select
    End If
    DeleteToolbar
End Sub

(6) 위의 Workbook_BeforeClose 이벤트 프로시저에서 호출한 DeleteToolbar 프로시저를 작성합니다.

Sub DeleteToolbar()
    On Error Resume Next
    CommandBars("자동감지 도구모음").Delete
    On Error GoTo 0
End Sub

오늘은 여기까지…

정리 — 자동감지 도구모음 핵심 코드

구분 사용한 코드 역할
도구모음 생성 CommandBars.Add 빈 도구모음 만들기
버튼 추가 Controls.Add(msoControlButton) 아이콘 버튼 삽입
동작 연결 .OnAction = "Button" & i 클릭 시 실행할 프로시저
위치 감지 Union(Target, [MyRange]).Address = [MyRange].Address 영역 내부 여부 판단
표시 전환 CommandBars(...).Visible 나타내기/숨기기

자주 묻는 질문 (FAQ)

Q1. 도구모음은 언제 만들어지나요?

Workbook_Open 이벤트에서 CreateToolbar 프로시저를 호출해 파일을 열 때마다 새로 만들고, 닫을 때 DeleteToolbar로 삭제합니다.

Q2. 셀 포인터가 특정 영역 안에 있는지 어떻게 알 수 있나요?

Union 메서드로 Target과 영역을 합친 주소가 영역의 주소와 같으면 영역 안에 있는 것입니다.

Q3. 버튼의 아이콘 모양은 어떻게 정하나요?

버튼의 FaceId 속성에 번호를 지정합니다. 번호에 따라 내장 아이콘 모양이 달라집니다.

마치며

셀의 위치에 따라 필요한 도구가 자동으로 나타나도록 만들면 사용자가 훨씬 편리하게 쓸 수 있습니다.