- 최초 작성일: 2001-01-30
- 최종 수정일: 2026-09-30
- 조회수: 4 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 분산형 차트 응용
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문의 내용을 메일로 보냅니다.
사용자 정의 목록을 추가해서 정렬시키는 방법은 제가 방법을 잘 몰라서
그런 거였습니다. 그것은 해결되었습니다. 다른 문제점에 관한 것을 파일로
보냅니다. 읽어보시고 답변을 보내주시면 감사하겠습니다.
그리고 님은 참 좋은 일을 하시는군요.
저도 언젠가는 이런 홈을 하나 만들고 싶은 마음이 굴뚝같아요.
그렇지만 지금은 실력이 워낙 모자라서 안되고요 나이먹고 혼자서 책보고
공부하려니 어려운 점이 많군요.
그럼 새해에는 하시는 일 잘 되시고 가내 두루 평안하시길…
새해 복 많이 받으시구요, 올핸 더욱 간강하시길 빌께요.
제가 컴이 마니 서툽니다. 주위 분의 권유로 알게 되었는데요…
세상에 이렇게 고마운 사람이 존재하다니…
존재의 이유를 넘어서 꼭 존재해야되는 그 어떤…(이상해지네?)
우이되뜬 고맙습니다. 건강하세요…
설 연휴는 잘들 보내셨습니까? 연휴 3일에다 지난 금요일은 Exceller가 다니는 회사는 금요일까지 휴무라 일주일 화끈하게(?) 쉬었습니다. 이제 양음력 설을 다 보냈으니 다시 일상으로 돌아와서…
위의 메일은 설을 맞아 Exceller에게 격려의 메일을 보내신 분들 중에 몇 분의 것을 인용해 본 것입니다.
Exceller는 개인적으로 "Interactive"라는 단어와 "상호침투"라는 철학용어를 좋아합니다. 이 세상은 혼자 태어나서 혼자 살다가 혼자 가는 것이 아닙니다. 사회 생활을 하는 이상(사회 생활을 하지 않고 로빈슨 크루소와 같이 고립된 생활을 하는 경우에 있어서도 마찬가지입니다만…) 자기 혼자 힘으로 되는 일은 하나도 없다해도 과언이 아닐 것입니다.
이런 세상을 살면서 서로에게 자극을 주고 영향을 받기 위해서는 서로간의 적극적인 의사소통이 필수적입니다.
Exceller의 홈을 찾으시는 분이 하루 평균 600~700분 정도 되는 것 같습니다만 정기적으로 인사를 주고받거나 모니터링을 해 주시는 분은 아직 소수입니다. 잘하는 점이 있으면 "잘한다 더 잘해라!"하는 격려의 말을, 잘못하거나 아쉬운 부분이 있으면 "이 부분은 이렇게 고쳤으면 좋겠다!"하는 등의 Interactive한 행동이 보다 발전적인 관계를 지속시켜 나가는 필수요소라고 생각합니다.
"어떻게 하면 EXCEL과 VBA를 잘 할 수 있습니까?" 라고 질문을 하시는 분이 가끔 계십니다. 우리는 매사에 너무 조급하게, 단 시간내에 끝장을 보려는 성향이 짙습니다. "흥미를 갖고 지속적으로 재미있게 공부하는 것"이외의 다른 방법을 Exceller는 알고 있지 못합니다. 또한 이것은 EXCEL과 VBA뿐만 아니라 다른 어떤 것을 배우든 마찬가지로 적용되는 사항일 것입니다.
"닷컴 닷컴 하던게 바로 어제 같은데 벌써 닷곤(Dot-gone)인가?" 라고 한탄하던 어느 번처 사업가의 말이 단순한 넋두리로만 들리지는 않습니다. 무슨 일을 하든 "단 시간 내에 끝장을 내겠다"는 생각은 버려야 합니다. 21일만 하면 아무개처럼 하고, 한달만에 완성할 수 있는 일이라면 애당초 시작조차 않았을 것이고 도전할 가치도 없는 것입니다.
무슨 얘기를 하다가 또 여기까지… 본론으로 들어갑니다.
분산형 차트 응용
핵심 요약: 차트 데이터 레이블
ApplyDataLabels로 레이블을 만들고 Points 수만큼 순환하며 각 레이블 텍스트를 셀 값으로 바꿉니다.
- 1단계: 지점명 범위에 이름을 정의하고 차트 개체를 변수에 담습니다.
- 2단계: ApplyDataLabels로 계열에 데이터 레이블을 적용합니다.
- 3단계: 점마다 DataLabel 텍스트를 지점명으로 바꿉니다.
Step 1: 오늘의 질문
안녕하세요?
이런 좋은 곳이 있네요.
책을 찾아봐도 궁금함을 풀 수가 없어 도움을 부탁드립니다.
다음과 같은 테이블이 있습니다.
| 지점명 | 실적 | 이익 |
|---|---|---|
| 강남 | 1000 | 500 |
| 강북 | 2000 | 800 |
| 강서 | 3000 | 1000 |
| 강동 | 2500 | 900 |
이것을 차트로 그리면 보통 다음과 같이 되잖아요?
이것을 다음과 같이 바꾸고자 합니다.
위에서 지점들이 위치한 좌표는 설명상 그냥 표시한 것이지만
실제로는 이익과 실적이 만나는 곳에 지점명이 데이터 레이블과
함께 나타나도록 하고 싶습니다.
데이터 레이블도 자동으로 나오게 하고, 지점수가 많더라도
범위만 설정하면 자동으로 나오게 하는 방법이 있습니까?
자세히 알려주시면 대단히 감사하겠습니다.
즉, 지점별 실적(가로축)과 이익(세로축)이 만나는 위치에 지점명이 데이터 레이블로 표시되도록 하고 싶다는 질문입니다.
Step 2: 분산형 차트로 만들어 보기
아래와 같은 지점별 매출액과 경상이익 표가 있다고 가정합니다.
| 지점명 | 매출액 | 경상이익 |
|---|---|---|
| 강동 | 1100 | 750 |
| 강서 | 2800 | 800 |
| 강남 | 3000 | 1800 |
| 강북 | 3300 | 600 |
| 부산 | 1800 | 1100 |
| 대구 | 2100 | 1000 |
| 대전 | 1500 | 1090 |
| 광주 | 2500 | 1500 |
이것을 가지고 차트를 만들면 아래와 같은 형태가 될 것입니다. 그런데 어떻게 만들었나고요? 분산형 차트를 사용하시면 됩니다.
표에서 데이터 부분, 즉 지점명을 제외한 매출액과 경상이익 값만 선택한 다음 "분산형" 차트를 지정해 보세요.
대충 모양은 비슷한데 뭔가가 빠진 듯 하지요? 경상이익과 매출액을 축으로 하여 두 항목이 만나는 지점에 표시를 해 준 것 까지는 좋은데 각각의 네모가 어느 지점을 가리키는 것인지 알려면 한참을 들여다 보아야 합니다. 이런 자료를 윗분께 보고드리면 일은 일대로 하면서 욕얻어 먹기 딱 좋지요. 가뜩이나 눈도 침침한데 해괴한(?) 것을 갖고와서
따라서 각 네모마다 지점명을 표시해 주기만 하면 될 것 같은데… 차트와 관련된 여러 가지 속성값을 변경해 주면 간단하게 해결이 될 것 같지만 더 이상은 방법이 없습니다. 혹시 방법을 아시는 분은 연락주시기 바랍니다.
하지만 그렇다고 해서 여기서 순순히 포기할 Exceller가 아니지요? ^^ 워크시트 상에서 수작업 조작을 통해서는 불가능하지만 VBA의 도움을 받으면 해결을 할 수 있습니다.
Step 3: DisplayLabel 프로시저
Sub DisplayLabel()
Dim rngBranch As Range
Dim chtMyChart As Chart
Dim i As Integer
Dim intBranch As Integer
'//늘 그래왔듯이 등장인물, 즉 필요한 변수들을 먼저 지정합니다.
Set chtMyChart = ActiveSheet.ChartObjects(2).Chart
On Error Resume Next
Set rngBranch = Range("지점명")
'//현재 시트에 두 개의 시트가 있는데 이 중에서 두번째 차트를 대상으로 하기 위해
'//변수에 담아두고, 레이블로 사용할 지점명 부분도 rngBranch라는 변수에 담습니다.
chtMyChart.SeriesCollection(1).ApplyDataLabels _
Type:=xlDataLabelsShowValue, AutoText:=True
'//SeriesCollection 메서드는 차트나 차트 그룹에 있는 하나(또는 전체)의 계열을
'//지정할 때 사용하게 됩니다. ApplyDataLabels 속성은 계열에 이름표를 표시하는
'//속성입니다. 그리고 AutoText는 문맥에 따라 해당하는 텍스트를 자동으로 생성하는
'//속성입니다.
'//EXCEL에는 여러 개의 오브젝트가 있습니다만 그 중에서 가장 다양한 속성을 가진
'//것이 바로 차트 오브젝트 입니다. 따라서 위에서 설명드린 속성들은 물론이려니와
'//그 밖의 다른 속성들과 메서드에 대해서도 도움말을 찾아보시기 바랍니다.
intBranch = chtMyChart.SeriesCollection(1).Points.Count
'//Points는 "차트의 계열에 있는 하나의 데이터 요소"를 의미합니다. 따라서 이 문장은
'//첫번째 계열안에 몇 개의 요소가 있는지를 카운팅해서 해당값을 intBranch 변수에
'//저장하는 것입니다.
'//그런 다음에 포인트 수만큼 순환문을 돌면서 DataLabel의 값을 차트 상에 표시하는
'//것입니다.
For i = 1 To intBranch
With chtMyChart.SeriesCollection(1).Points(i).DataLabel
.Characters.Text = rngBranch.Cells(i)
.Font.Size = 10
End With
Next i
End Sub
Excel 2013 이후에는 차트에서 데이터 레이블을 추가한 뒤 "셀 값에서 레이블 값 가져오기" 옵션으로 지점명 범위를 지정하면 VBA 없이도 같은 결과를 얻을 수 있습니다. VBA로 처리할 때에는 DataLabel.Text 속성을 사용해도 됩니다.
Step 4: 레이블 삭제하기
그리고 레이블을 삭제하는 코드는 아래와 같습니다. 간단하지요. 너무 간단해서 설명하고 말고 할 것도 없는 것 같고… HasDataLabel 속성을 False로 지정하면 됩니다.
Sub DelDataLabel()
Dim chtMyChart As Chart
Set chtMyChart = ActiveSheet.ChartObjects(2).Chart
chtMyChart.SeriesCollection(1).HasDataLabels = False
End Sub
마무리
다음 시간에…
정리 — 차트 레이블 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 차트 지정 | ActiveSheet.ChartObjects(2).Chart | 두 번째 차트 |
| 레이블 적용 | SeriesCollection(1).ApplyDataLabels | 계열에 레이블 추가 |
| 점 개수 | SeriesCollection(1).Points.Count | 데이터 요소 수 |
| 텍스트 지정 | .Characters.Text = rngBranch.Cells(i) | 지점명 표시 |
| 삭제 | HasDataLabels = False | 레이블 제거 |
자주 묻는 질문 (FAQ)
Q1. 분산형 차트의 점마다 이름을 표시하려면?
각 점의 DataLabel 텍스트를 이름이 들어 있는 셀 값으로 바꾸도록 VBA로 처리하면 됩니다.
Q2. 데이터 레이블을 지우려면?
계열의 HasDataLabels 속성을 False로 지정합니다.
Q3. Points는 무엇인가요?
차트 계열에 있는 하나의 데이터 요소를 의미합니다.
마치며
수작업으로 어려운 차트 레이블도 VBA의 Points와 DataLabel을 활용하면 자동으로 표시할 수 있습니다.