- 최초 작성일: 2002-06-12
- 최종 수정일: 2026-09-30
- 조회수: 9 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 자동감지 도구모음 만들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 아주 재미있는 것을 하나 살펴보도록 하겠습니다. John Walkenbach님의 아이디어를 응용한 것으로 "자동감지 도구모음"이라는 이름을 붙여 보았습니다.
자동감지 도구모음 만들기
핵심 요약: 자동감지 도구모음
셀 포인터가 지정한 영역에 들어오면 도구모음이 나타나고 벗어나면 사라지도록 SelectionChange 이벤트와 Union 메서드를 이용합니다.
- 1단계: Workbook_Open에서 CommandBars.Add로 도구모음과 버튼을 만듭니다.
- 2단계: 버튼의 OnAction에 Offset으로 셀을 이동하는 프로시저를 연결합니다.
- 3단계: SelectionChange에서 Union으로 영역 포함 여부를 확인해 Visible을 전환합니다.
Step 1: 자동감지 도구모음이란?
아래의 테이블 중 아무 셀이나 클릭해 보세요. '자동감지 도구모음' 이라는 도구모음이 나타나며 각 아이콘을 클릭하면 셀 포인터가 지정한 방향으로 이동할 것입니다.
왜 '자동감지'라고 하였는지 이해하시겠지요?
어떻게 만들었는지 살펴보도록 합시다.
참고: 이 예제의 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 속성에 번호를 지정합니다. 번호에 따라 내장 아이콘 모양이 달라집니다.
마치며
셀의 위치에 따라 필요한 도구가 자동으로 나타나도록 만들면 사용자가 훨씬 편리하게 쓸 수 있습니다.