- 최초 작성일: 2002-12-24
- 최종 수정일: 2026-09-30
- 조회수: 8 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 선택 영역에 화살표 그리기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Our bodies are our gardens, to the which our wills are gardeners. 신체는 우리의 정원이며, 의지는 이 정원의 정원사이다.
'모든 문제에는 해답이 있다!'는 생각을 가지고 매사에 임하는 사람이 실제로 답을 찾아 내더군요. 지금까지 경험에 견주어 보건대…
선택 영역에 화살표 그리기
핵심 요약: 선택 영역에 화살표 그리기
셀 서식으로는 사선만 그릴 수 있으므로, 화살표는 VBA로 선 개체를 만들어 화살촉을 지정하는 방법을 사용합니다.
- 1단계: Application.InputBox(Type:=8)로 범위를 선택받습니다.
- 2단계: 범위의 Left, Width, Top, RowHeight로 선의 좌표를 계산합니다.
- 3단계: AddLine으로 선을 그리고 시작·끝 화살촉 스타일을 지정합니다.
Step 1: 어떤 질문이었을까요?
엑셀에서 색 채우기나 테두리 아이콘처럼, 셀을 선택하고 누르면 해당 셀들 안에 일제히 화살 선이 채워지게 할 수 있나요? 매크로나 애드인을 사용하지 않고도 가능한지 궁금합니다.
Step 2: 셀 서식으로 사선 그리기
화살 선은 아니고 사선이 채워지도록 할 수는 있습니다.
(1) 선을 그릴 범위를 지정하고 서식-셀 메뉴를 선택합니다. (2) 테두리 탭을 선택하고 테두리 항목에서 대각선 방향을 클릭하면 아래와 같이 사선이 그려집니다.
Step 3: 화살표를 자동으로 그리는 매크로
이 질문을 접하고 한 가지 생각나는 것이 있어 만들어 보았습니다. 아래의 버튼을 누른 다음 적당한 영역을 선택해 보세요.
Sub DrawingArrow()
Dim rngTarget As Range
Dim sngLeft As Single
Dim sngTop As Single
Dim sngWidth As Single
On Error GoTo ET
' 늘 그러하듯이… 필요한 변수를 선언해 줍니다.
Set rngTarget = Application.InputBox("화살표를 그려넣을 범위를 지정하세요", Type:=8)
' InputBox 메서드를 사용하여 사용자가 설정한 영역(Range)을 rngTarget 변수에 담습니다.
With rngTarget
sngLeft = .Left
sngWidth = sngLeft + .Width
sngTop = .Top + .RowHeight / 2
End With
' rngTarget 영역의 왼쪽 위치, 상단 위치를 파악하여 변수에 각각 담아 둡니다.
' 화살표를 셀의 중간에 그리기 위해 RowHeight 속성을 반으로 나누었습니다.
ActiveSheet.Shapes.AddLine(sngLeft, sngTop, sngWidth, sngTop).Select
With Selection.ShapeRange.Line
.BeginArrowheadStyle = msoArrowheadOval
.EndArrowheadStyle = msoArrowheadTriangle
End With
Selection.TopLeftCell.Select
' 선택한 영역에 화살표를 그려주는 부분입니다.
' 화살표 시작 부분은 둥글게, 끝나는 부분은 삼각형으로 설정합니다.
ET:
' 실행 도중 에러가 발생한 경우에 대비한 에러 트래핑 구문입니다.
If Err.Number <> 0 Then
MsgBox "Error 발생 : " & Err.Number, , Err.Description
Err.Clear
End If
End Sub
Application.InputBox의 Type을 8로 지정하면 사용자가 마우스로 범위를 선택할 수 있습니다. 선택한 영역의 왼쪽 위치와 너비, 첫 행의 세로 중간 위치를 계산해 Shapes.AddLine으로 선을 그리고, 시작점은 원(msoArrowheadOval), 끝점은 삼각형(msoArrowheadTriangle)으로 지정했습니다.
그려지긴 하는데 항상 선택 영역의 첫번째 행에만 그려지고, 화살표의 모양새도 그렇고… 여러 가지 면에서 융통성이 없을 것입니다. 나머지 부족한 부분에 대해서는 여러분이 응용력을 발휘하여 보완해 보시기 바랍니다. 유저폼을 사용하여 사용자가 여러 가지 변화를 줄 수 있도록 사용자 입장에서 만들어 보세요. 아주 재미있지 않겠습니까? 게임이나 하면서 Time Killing 하는 것 하고는 비할 바가 아니지요.
다음 시간에…
정리 — 화살표 그리기 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 범위 입력 | Application.InputBox(..., Type:=8) | 마우스로 범위 선택 |
| 선 그리기 | ActiveSheet.Shapes.AddLine | 두 점을 잇는 선 생성 |
| 시작 모양 | BeginArrowheadStyle = msoArrowheadOval | 시작점을 원으로 |
| 끝 모양 | EndArrowheadStyle = msoArrowheadTriangle | 끝점을 삼각형으로 |
| 사선 채우기 | 서식-셀-테두리 탭 | 대각선 테두리 지정 |
자주 묻는 질문 (FAQ)
Q1. 셀 서식만으로 화살표를 채울 수 있나요?
화살표는 불가능하고, 셀 서식의 테두리 탭에서 대각선 테두리를 지정해 사선을 그리는 것까지만 가능합니다.
Q2. InputBox에서 Type:=8은 어떤 의미인가요?
Application.InputBox의 Type 인수를 8로 지정하면 입력값으로 Range 개체를 받습니다. 사용자는 마우스로 셀 범위를 선택하면 됩니다.
Q3. 화살촉 모양은 어떻게 바꾸나요?
선 개체의 Line 속성에서 BeginArrowheadStyle과 EndArrowheadStyle에 원하는 msoArrowheadStyle 상수를 지정하면 됩니다.
마치며
이 예제는 항상 선택 영역의 첫 행에만 그려지는 단순한 형태입니다. 유저폼을 활용해 사용자가 옵션을 고를 수 있도록 확장해 보시기 바랍니다.