- 최초 작성일: 2025-01-24
- 최종 수정일: 2026-09-27
- 조회수: 15 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 244회 - 구성 비율 표시
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
열심히 일하는 것처럼 보이는 방법(?)
행동경제학 분야의 세계적 권위자이자 <상식 밖의 경제학>의 저자인 댄 애리얼리의 이야기로 시작합니다(아래에서 숫자 ①, ②는 편의상 제가 붙였습니다).
저는 사회 초년생 시절에 일했던 은행에서 엑셀의 매크로 기능을 자주 활용했습니다. 매크로 기능을 활용하면, 데이터만 입력하고도 아주 훌륭한 보고서를 만들 수 있었습니다. 그리고 분석을 마치고 보고서를 작성하는 데 2분 정도 걸렸습니다. 그동안에 마우스 포인터가 모래시계로 변경되어 매크로가 작동하고 있는 것을 알려주었습니다. 보고서는 아주 유용했지만, 많은 사람들이 매크로가 너무 느리다고 불평했습니다.
① 매크로의 속도를 높이기 위한 한 가지 방법은 매크로가 돌아가는 모습이 눈에 띄지 않도록 하는 것입니다. 이때 컴퓨터 화면에는 모래시계만 나옵니다. 저는 처음에는 이 방법을 사용했습니다.
② 하지만 나중에는 재미삼아 방법을 바꿔서 사람들이 매크로가 돌아가는 모습을 직접 볼 수 있도록 했습니다. 이 모습은 마치 고속으로 돌아가는 비디오 화면과도 같았습니다. 매크로 기능은 데이터가 쪼개지고 데이터베이스의 여러 구간에서 색상이 변하고 표제와 그래프가 만들어지는 모습을 아무런 여과 없이 보여주었습니다. 그러면 어떤 문제가 발생했을까요? 이제 프로그램의 실행 속도는 이전보다 3배나 느려졌습니다.
그런데 놀라운 일이 벌어졌습니다. 제 동료들은 매크로 기능이 현란하게 작동하는 모습에 현혹되어 아주 빠르게 돌아간다고 말했습니다. 교수님께서는 이런 현상을 어떻게 합리적으로 설명하실 수 있습니까?
댄 애리얼리의 <왜 양말은 항상 한 짝만 없어질까?>에 나오는 일화입니다.
가로 막대형 차트에 항목별 구성 비율을 표시해주는 Code
핵심 요약: 누적 가로 막대형 차트에 항목별 구성 비율 표시하기
'합계' 계열을 보조 축에 두고 채우기와 테두리를 없앤 뒤 합계 레이블을 막대 오른쪽에 두고, =B4/$F4로 만든 비율 데이터를 Start 이름으로 정의한 다음 VBA 코드로 각 계열의 데이터 레이블에 비율을 표시합니다.
- 차트 준비: 누적 가로 막대형 차트 작성 후 '합계' 계열을 보조 축, 채우기 없음, 선 없음으로 설정
- 비율 데이터: B14 셀에 =B4/$F4 입력 후 복사, B14 셀에 'Start' 이름 정의
- VBA: DisplayPercentage 프로시저가 Format(값, "#.#%")로 각 레이블에 비율 지정
- 참고: 누적 세로 막대형 차트에서도 작동
체감 속도와 ScreenUpdating
코딩할 때 작업 속도를 빠르게 하기 위해 사용하는 방법들이 있습니다. ①에서 사용한 코드는 아마 이런 것이었을 겁니다.
Application.ScreenUpdating = False
이렇게 하면 매크로 실행 과정을 화면에 표시하지 않으므로 실행 속도가 빨라집니다. 그런데도 사람들이 실행 속도가 느리다고 하자 ②에서는 코드를 이렇게 바꾸었을 테죠.
Application.ScreenUpdating = True
이제부터는 각종 편집 작업이나 서식 설정, 시트나 범위 이동 등 각종 작업 과정이 그대로 화면에 표시되므로 프로그램 실행 속도가 느려집니다. 그런데도 사람들은 이 광경을 보고 오히려 열광하며 만족스러워했다고 합니다.
행동경제학에서 말하듯, 인간이 늘 이성적이고 합리적인 것은 아닙니다. 댄 애리얼리에 따르면, "누군가가 나를 위해 일을 한다는 생각이 들 때 우리는 매우 큰 호감을 갖는다. 사람뿐만 아니라 컴퓨터 알고리즘에도 적용된다"고 합니다.
매크로가 우리를 위해 바쁘게 작동하는 모습을 의도적으로 보여주는 것이 때로는 체감만족도를 높이는 방법이 될 수도 있겠습니다. "동료들에게 기술이 그들에게 도움을 주기 위해 노력하는 모습, 즉 매크로 기능이 바쁘게 작동하는 모습을 앞으로도 계속 보여주도록" 해보세요.^^;
가로 막대형 차트에 구성 비율 표시하기
이번 시간에 만들어 볼 차트는 [완성 예]와 같습니다. VBA의 도움을 사알~짝 받으면 '항목별 구성 비율이 표시'되도록 할 수 있습니다.
차트를 작성할 원본 데이터는 [표 1]과 같습니다.
(1) 예제 파일에서 A3:F10 영역을 범위로 지정하고 '누적 가로 막대형' 차트를 선택합니다.
(2) '합계' 계열을 마우스 오른쪽 버튼으로 클릭하고 '데이터 계열 서식' 메뉴를 선택합니다.
(3) '데이터 계열 서식' 대화상자에서 '보조 축'을 선택합니다.
(4) '채우기 - 채우기 없음', '테두리 - 선 없음' 항목을 선택합니다.
(5) '합계' 계열이 선택된 상태에서 오른쪽 마우스 버튼을 클릭하고 '데이터 레이블 추가' 메뉴를 선택합니다. 추가된 레이블을 막대 오른쪽으로 끌어다 놓기(drag & drop)합니다.
(6) 데이터와 차트의 관계는 물체와 그림자 관계에 비유할 수 있습니다. 그림자 모양을 바꾸려면 그림자 그 자체가 아니라 물체에 접근해야 합니다. 차트도 마찬가지입니다.
누적 가로 막대형 차트의 각 항목에 비율을 표시하기 위한 데이터를 작성합니다. B14 셀에 다음과 같은 수식을 입력하고 복사합니다.
=B4/$F4
이 수식이 의미하는 것은?
B14 셀에 입력한 수식을 오른쪽과 아래쪽으로 복사할 때, 참조할 합계 부분은 F4, F5, F6... 등과 같이 F열은 고정이 되어야 하는 반면, 행 번호는 변경되어야 합니다. 따라서 셀 주소 형태를 혼합 주소($F4)로 지정해 주었습니다.
참고: 원문 설명 수정
원문에는 "B4 셀에 입력된 수식을 복사할 때 참조할 합계 부분은 F14, F15, F16..."으로 되어 있었습니다. 수식은 B14 셀에 입력하고(=B4/$F4), 참조하는 합계는 원본 표의 F4, F5, F6...이므로 이에 맞게 바로잡았습니다.
(7) B14 셀에 'Start'라는 이름을 정의합니다. 이 이름은 (8)에서 코딩 시 사용됩니다.
(8) <Alt>+<F11> 키를 눌러 Visual Basic Editor 상태로 들어갑니다. 모듈을 삽입하고 다음 코드를 작성합니다.
Sub DisplayPercentage()
Dim chtChart As Chart ' 차트 개체에 접근하기 위한 변수
Dim objSeries As Series ' 차트의 계열에 접근하기 위한 변수
Dim lblChartLabel As DataLabel ' 차트의 레이블에 접근하기 위한 변수
Dim x As Integer ' 행 방향으로 이동할 위치
Dim y As Integer ' 열 방향으로 이동할 위치
Set chtChart = ActiveSheet.ChartObjects(1).Chart
' 활성화 된 시트의 첫 번째 차트를 chtChart 변수에 할당
For Each objSeries In chtChart.SeriesCollection
objSeries.HasDataLabels = True ' 레이블 표시
x = 1 ' 기준(Start) 셀에서 행 방향 이동 위치 지정
y = y + 1 ' 기준 셀에서 열 방향 이동 위치 지정
' 비율 값과 표시 형식을 지정하고 다음 행 작업 준비
For Each lblChartLabel In objSeries.DataLabels
lblChartLabel.Text = Format(Range("Start").Offset(x - 1, y - 1).Value, "#.#%")
' Start 셀로부터 지정한 행/열 만큼 이동한 셀 값을 차트 레이블로 지정
x = x + 1
Next lblChartLabel
Next objSeries
End Sub
(9) 코드를 실행(<F5> 키를 누르거나 'Sub/사용자 정의 폼 실행' 아이콘 클릭)하면 차트에 항목별 구성 비율이 표시됩니다. 이 코드는 누적 세로 막대형 차트의 경우에도 작동합니다.
(10) 계열선을 비롯한 차트 서식을 조정하여 차트를 완성합니다. '범례'에 있는 '합계'를 지우려면 '합계' 부분을 두 번 클릭하고 <Del> 키를 누르면 됩니다.
엑셀 버전에 따라 화면 인터페이스는 조금씩 다를 수 있습니다만, 내용을 잘 읽어보시면 상황에 적절히 대처할 수 있으리라 생각합니다.
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI)은 다를 수 있습니다. 이미지 속 매장 이름, 유형, 수치는 예시이고 차트와 비율은 그 수치로 실제 계산해 그렸습니다. 도서 <왜 양말은 항상 한 짝만 없어질까?>의 표지 이미지는 싣지 않았습니다.
정리 — 구성 비율 표시 차트 만드는 순서
| 단계 | 내용 |
|---|---|
| (1) | A3:F10 영역으로 '누적 가로 막대형' 차트 작성 |
| (2)~(4) | '합계' 계열을 보조 축으로 옮기고 채우기 없음, 선 없음으로 설정 |
| (5) | '합계' 계열에 데이터 레이블을 추가하고 막대 오른쪽으로 이동 |
| (6)~(7) | =B4/$F4 수식으로 구성 비율 데이터를 만들고 B14 셀에 'Start' 이름 정의 |
| (8)~(9) | DisplayPercentage 프로시저를 실행하여 각 계열의 데이터 레이블에 비율 표시 |
| (10) | 차트 서식 조정, 범례의 '합계' 삭제 |
자주 묻는 질문 (FAQ)
Q1. 누적 가로 막대형 차트에 항목별 구성 비율을 표시하려면 어떻게 하나요?
합계 계열을 보조 축에 두고 채우기와 테두리를 없앤 다음, 구성 비율 데이터(=B4/$F4)를 만들어 이름(Start)을 정의합니다. 이후 VBA 코드로 각 계열 데이터 레이블의 텍스트를 비율 값으로 지정합니다.
Q2. 이 코드는 세로 막대형 차트에서도 작동하나요?
누적 세로 막대형 차트의 경우에도 작동합니다.
Q3. 범례에서 '합계'를 없애려면 어떻게 하나요?
범례에서 '합계' 부분을 두 번 클릭하여 선택한 다음 Del 키를 누르면 됩니다.
마치며
비율이 함께 보이는 차트는 한눈에 구성을 파악하기 좋습니다. 예제 파일에서 단계별로 따라 해 보세요!
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.