- 최초 작성일: 2014-01-27
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 235회 - 차트 계열색 바꾸기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
차트를 만들면 계열 색상은 엑셀이 자동으로 지정해 줍니다. 그런데 셀에 지정해 둔 배경색을 그대로 차트에도 반영하고 싶다면 어떻게 해야 할까요? 이번 시간에는 셀 배경색과 차트 계열 색을 실시간으로 연동시키는 코드를 다뤄보겠습니다.
차트 계열 색을 셀 배경색과 똑같이 맞추기
핵심 요약: 셀 배경색을 차트 계열 색으로 연동하기
ChangeChartSeriesColor 프로시저는 차트 계열의 SERIES 수식에서 값 범위 주소를 뽑아낸 뒤, 각 포인트의 색을 대응하는 셀의 배경색으로 그대로 맞춰 줍니다.
- 사전 준비: 값이 들어있는 셀들의 배경색을 원하는 색으로 지정
- 실행 방법: 색상을 바꿀 차트를 선택한 뒤 프로시저 실행
- 핵심 로직: Split(objSeries.Formula, ",")(2)로 값 범위 주소 추출
- 적용 범위: 막대형, 원형 등 대부분의 차트 종류에서 동일하게 동작
평범한 차트에서 시작하기
왼쪽의 테이블을 이용하여 차트를 작성하면 대략 이런 모양이 나옵니다.
| 판매 | 수량 |
|---|---|
| 화동 | 82 |
| 화서 | 173 |
| 화남 | 113 |
| 화북 | 115 |
| 화중 | 61 |
누구나 만들 수 있는, 그래서 어디서나 볼 수 있는 평범한 차트이지요. 이번에는 '수량' 열의 셀 배경색을 원하는 색으로 하나씩 지정한 다음, 차트를 선택한 후 버튼을 클릭해 보세요.
무엇이 달라졌는지 눈치채셨나요? 그렇습니다! 셀의 배경 색에 따라 차트 계열(포인트)의 색상이 그대로 연동되어 바뀌었지요? 물론 원형 차트에만 가능한 것이 아니라, 막대형을 비롯한 다른 차트에서도 똑같이 작동합니다.
ChangeChartSeriesColor 프로시저 살펴보기
코드를 보도록 하지요. 색상을 바꾸고 싶은 차트를 먼저 선택한 다음 이 프로시저를 실행하면 됩니다.
Sub ChangeChartSeriesColor()
Dim chtMyChart As Chart
Dim objSeries As Series
Dim varValue As Variant
Dim intNum As Integer
Dim strChartFormula As String
On Error GoTo ET
Set chtMyChart = ActiveChart
For Each objSeries In chtMyChart.SeriesCollection
strChartFormula = Split(objSeries.Formula, ",")(2)
' 차트 계열의 Formula 중 값(Values) 범위 주소를 Split 함수로 추출해 냅니다.
varValue = objSeries.Values
For intNum = 1 To UBound(varValue)
' 차트의 포인트 수만큼 돌면서 지정한 셀 색상으로 채웁니다.
objSeries.Points(intNum).Interior.Color = Range(strChartFormula).Cells(intNum).Interior.Color
' 각 포인트의 색을 값 범위의 해당 셀 배경색과 똑같이 채웁니다.
Next intNum
Next objSeries
ET:
If chtMyChart Is Nothing Then
' 차트를 선택하지 않은 상태에서 프로시저를 실행하면
MsgBox "색상을 바꿀 차트를 먼저 선택하시라니깐요!!", , "아이엑셀러 닷컴"
Exit Sub
End If
End Sub
코드 설명
objSeries.Formula는 =SERIES(계열명, 항목범위, 값범위, 순서) 형태의 문자열입니다. 여기서 Split(objSeries.Formula, ",")(2)로 세 번째 조각, 즉 '값 범위' 주소만 뽑아냅니다. 그런 다음 For ~ Next 문으로 차트의 포인트(막대 하나, 파이 조각 하나 등)를 하나씩 돌면서, 그 포인트에 대응하는 셀의 Interior.Color를 그대로 Points(intNum).Interior.Color에 대입해 색을 맞춥니다.
참고: 오류 처리
차트를 선택하지 않은 상태에서 이 프로시저를 실행하면 ActiveChart가 Nothing이 되어 오류가 발생합니다. On Error GoTo ET로 이 오류를 잡아, "색상을 바꿀 차트를 먼저 선택하시라니깐요!!"라는 안내 메시지를 보여준 뒤 안전하게 종료하도록 처리했습니다.
차트(Chart 개체)는 가장 많은 하위 개체·속성·메서드를 거느리고 있는 개체입니다. 그만큼 다양한 기능과 역할을 수행할 수 있다는 의미이며, 서점에 가 보면 차트만 다루는 엑셀 책들이 즐비할 정도로 그 기능이 방대합니다.
정리 — ChangeChartSeriesColor 프로시저 핵심 요소
| 요소 | 역할 |
|---|---|
| objSeries.Formula | =SERIES(...) 형태의 계열 수식 문자열 |
| Split(objSeries.Formula, ",")(2) | 수식을 콤마로 나눈 세 번째 요소 — 값(Values) 범위 주소 |
| objSeries.Points(intNum).Interior.Color | 차트의 각 포인트(막대/조각) 색상 |
| On Error GoTo ET | 차트를 선택하지 않은 상태에서 실행했을 때의 오류 처리 |
자주 묻는 질문 (FAQ)
Q1. 막대형 차트에도 사용할 수 있나요?
네. 원형 차트뿐 아니라 막대형, 세로 막대형 등 SeriesCollection과 Points 컬렉션을 갖는 대부분의 차트 종류에서 동일하게 동작합니다.
Q2. 계열이 여러 개 있으면 어떻게 되나요?
For Each objSeries In chtMyChart.SeriesCollection 문으로 모든 계열을 순회하므로, 계열이 여러 개라도 각 계열마다 대응하는 값 범위의 셀 배경색이 반영됩니다.
Q3. 실행했는데 '차트를 먼저 선택하라'는 메시지가 뜹니다.
이 프로시저는 반드시 차트를 클릭해서 선택한 상태(ActiveChart가 존재하는 상태)에서 실행해야 합니다. 워크시트의 빈 셀이 선택된 상태에서 실행하면 이 메시지가 나타납니다.
마치며
Chart 개체는 파고들수록 다룰 거리가 끝없이 나오는 재미있는 개체입니다. 오늘 다룬 방법을 응용하면 데이터 시각화의 표현력을 한층 더 끌어올릴 수 있을 거예요!