- 최초 작성일: 2025-01-24
- 최종 수정일: 2026-09-27
- 조회수: 49 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 249회 - 멀티 차트 만들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
어떤 구인 광고
얼마 전에 중국 출장 갔다가 화웨이 매장에서 이런 구인 광고를 보았습니다.
화웨이 판매원 모집
급여대우:
- 정상 근무 시: 월 3,000 ~ 4,000 위엔
- 노력할 경우: 월 4,000 ~ 5,000 위엔
- 더욱 힘 쓸 경우: 월 5,000 ~ 8,000 위엔
- 죽기살기로 할 경우: 월 10,000 위엔 이상(최고한도 없음)
'늑대문화'로 유명한 화웨이는 신상필벌 제도가 확립되어 있는 것으로도 알려져 있습니다. 중국 평균 노동자 대비 2 ~ 3배 높은 급여를 받으며, GE식 평가 방식을 도입하여 하위 5%의 직원들은 매년 퇴출시킨다고도 하죠(2013년 기준). 알리바바나 텐센트 등 최근 핫한 기업에 비해서는 관심도가 떨어져 있습니다만 주목해야 할 회사 중 하나입니다.
여러 제품 차트를 한꺼번에 만들어 주는 Code
핵심 요약: 옵션 단추 하나로 팀별 차트를 한꺼번에 만들기
ActiveX 옵션 단추를 클릭하면 차트 유형을 인수로 MakeMultiChart 프로시저가 호출되어, 새 워크시트에 팀별 제품 유형 실적 차트를 AddChart2로 한꺼번에 만들고 한 행에 3개씩 배치합니다.
- Step 1: 그룹 상자(양식 컨트롤) + 옵션 단추 3개(ActiveX), Caption 지정, Sheet1에 Click 프로시저 작성
- Step 2: 모듈에 MakeMultiChart 하위 프로시저 작성
- 핵심 기법: Union으로 제목과 실적 영역 결합, Mod 연산자로 3개씩 배치
- 주의: 옵션 단추가 선택만 된다면 '디자인 모드'를 해제
멀티 차트란?
예제 파일에서 그룹 상자 안에 있는 옵션 버튼을 클릭하면 A3:F12 영역의 데이터를 이용하여 각 팀의 제품 유형별 실적을 보여주는 여러 개의 차트가 한꺼번에 만들어집니다. 이러한 차트를 '멀티 차트(Multi-chart)'라고 이름 붙여 보았습니다.
Step 1: 주 프로시저 코딩
(1) '개발 도구 - 삽입' 메뉴를 선택하고 '그룹 상자' 안에 세 개의 '옵션 단추'를 삽입합니다. 이 때 '그룹 상자'는 '양식 컨트롤'을, '옵션 단추'는 'ActiveX 컨트롤'에 있는 것을 사용한 것에 유의하세요.
(2) 삽입한 ActiveX 컨트롤의 속성은 해당 컨트롤을 더블 클릭하면 나타나는 '속성 창'에서 변경할 수 있습니다. 다른 부분은 그냥 두고 'Caption' 속성만 위 그림과 같이 원형, 3차원 원형, 도넛형으로 각각 지정합니다.
(3) 'Sheet1' 개체를 더블 클릭한 다음 코드 창에 다음과 같이 세 개의 프로시저를 작성합니다. 이 프로시저들은 워크시트에 작성되어 있는 ActiveX 컨트롤을 클릭했을 때 실행되는 프로시저입니다. 하위 프로시저(MakeMultiChart)를 불러와서 실행하며, 이 때 어떤 형태의 차트를 작성할지에 대한 정보를 함께 건네줍니다.
Private Sub OptionButton1_Click()
MakeMultiChart xlPie ' 원형 차트
End Sub
Private Sub OptionButton2_Click()
MakeMultiChart xl3DPie ' 3차원 원형 차트
End Sub
Private Sub OptionButton3_Click()
MakeMultiChart xlDoughnut ' 도넛형 차트
End Sub
참고: 코드 재구성
위 세 개의 프로시저는 원래 그림으로만 실려 있었고, 네이버 포스트 이미지 소실로 함께 사라졌습니다. 본문 설명(옵션 단추 세 개가 각각 원형, 3차원 원형, 도넛형 차트 유형을 MakeMultiChart에 전달)에 맞추어 다시 작성한 예시 코드이므로 컨트롤 이름과 세부 표기는 원본과 다를 수 있습니다. 예제 파일에 들어 있는 코드를 기준으로 사용하세요.
Step 2: 하위 프로시저 코딩
(1) Visual Basic Editor 상태(<Alt> + <F11>)에서 모듈을 하나 삽입하고 다음 코드를 작성합니다.
Sub MakeMultiChart(intX)
' 이 프로시저는 다른 외부 프로시저에서 호출하는 형태로 사용됩니다. 즉, 주 프로시저에 의해
' 호출되는 하위(또는 종속) 프로시저입니다. 이 때 주 프로시저로부터 매개 변수(intX)를
' 전달받아서 실행합니다.
Dim rngSource As Range ' 차트 영역 지정을 위한 개체 변수
Dim shtSheet As Worksheet ' 워크시트 개체에 접근하기 위한 개체 변수
Dim i As Integer ' For ~ Next 문에서 사용되는 변수
Dim intRow As Integer ' 차트 계열 수를 카운팅 할 변수
Dim intLeft As Integer ' 차트의 왼쪽 끝 위치를 지정할 변수
Dim intTop As Integer ' 차트의 위쪽 끝 위치를 지정할 변수
Dim lngWidth As Long ' 차트의 너비를 지정할 변수
Dim lngHeight As Long ' 차트의 높이를 지정할 변수
' 만들려는 시트와 같은 시트가 이미 있으면 지우기 위한 부분임.
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("다중차트").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set rngSource = Range("Start").CurrentRegion ' 차트 작성 영역 지정
intRow = rngSource.Rows.Count ' 테이블의 행 수를 카운팅하여 변수에 저장
Set shtSheet = Worksheets.Add ' 새로운 워크시트를 변수에 할당
ActiveSheet.Name = "다중차트" ' 시트 이름 지정
lngWidth = Range("A1").Width ' 차트의 너비 크기 지정
lngHeight = Range("A1").Height ' 차트의 높이 크기 지정
For i = 4 To intRow + 2 ' 데이터 수만큼 For ~ Next 문 반복
With Worksheets("Source")
Set rngSource = Union(.Range("A3:F3"), .Range(.Cells(i, 1), .Cells(i, 6)))
' 팀별로 차트를 만들기 위해 표의 제목 부분과 실적 부분을 Union 메서드를
' 이용하여 생성함
End With
With shtSheet.Shapes.AddChart2(201, intX, intLeft, intTop, lngWidth * 5, lngHeight * 12).Chart
' 지정한 위치에, 지정한 크기로 차트 생성. 이 때 작성되는 차트의 형태는
' 매개 변수로 전달받은 intX에 의해 결정됨
.SetSourceData rngSource
.SeriesCollection(1).ApplyDataLabels ShowCategoryName:=True, _
ShowPercentage:=True, ShowValue:=False
.ChartColor = 15
.ChartTitle.Font.Size = 12
.ChartTitle.Font.Bold = True
.Legend.Delete
End With
' 차트를 한 행에 3개씩 표시하기 위해 Mod 함수를 사용함.
If (i - 1) Mod 3 = 2 Then
intLeft = 0 ' 차트 왼쪽 위치 값 초기화
intTop = intTop + lngHeight * 12 ' 아래로 이동하기 위해 intTop 변수 값은 증가시킴
Else ' 그렇지 않으면...
intLeft = intLeft + lngWidth * 5 ' 차트를 지정한 크기만큼 옆으로 옮기기 위해
' intLeft 변수 값만 증가시킴.
End If
Next i
End Sub
(2) 'Source' 시트로 가서 '옵션 단추'를 클릭하면 지정한 차트가 '다중 차트' 시트에 한꺼번에 작성됩니다. 만약 프로시저가 실행되지는 않고 옵션 버튼이 선택되기만 한다면 '개발 도구'의 '디자인 모드' 아이콘을 클릭하여 선택 모드를 해제하세요.
참고: 원문 주석 수정
원문 코드의 주석에 "매개 변수로 전달받은 intY"라고 되어 있었지만 실제 매개 변수 이름은 intX이므로 주석을 바로잡았습니다. 코드 동작은 그대로입니다.
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI)은 다를 수 있습니다. 멀티 차트 이미지의 팀 이름, 제품 이름, 수치는 예시이며, 첫머리의 구인 광고 사진은 싣지 않고 광고 문구만 텍스트로 옮겼습니다.
정리 — 멀티 차트 만들기 코드의 구성
| 구성 요소 | 역할 |
|---|---|
| 옵션 단추 Click 프로시저 (주 프로시저) | 선택한 차트 유형(원형, 3차원 원형, 도넛형)을 인수로 MakeMultiChart 호출 |
| MakeMultiChart (하위 프로시저) | '다중차트' 시트를 새로 만들고 팀 수만큼 차트를 작성 |
| Union 메서드 | 표의 제목 행과 각 팀의 실적 행을 하나의 차트 원본 범위로 묶음 |
| AddChart2 메서드 | 지정한 위치와 크기, 유형으로 차트 생성 |
| Mod 연산자 | 차트를 한 행에 3개씩 배치하도록 위치 변수 조정 |
| 디자인 모드 | 해제해야 옵션 단추 클릭 시 프로시저가 실행됨 |
자주 묻는 질문 (FAQ)
Q1. 여러 개의 차트를 한꺼번에 만들려면 어떻게 하나요?
MakeMultiChart 같은 하위 프로시저에서 For ~ Next 문으로 팀 수만큼 반복하면서 AddChart2 메서드로 차트를 하나씩 만들면 됩니다. 각 차트의 위치와 크기는 변수로 지정합니다.
Q2. 옵션 단추를 클릭해도 프로시저가 실행되지 않고 선택만 됩니다.
'개발 도구' 탭의 '디자인 모드' 아이콘이 눌려 있는 상태입니다. 디자인 모드 아이콘을 클릭하여 선택 모드를 해제하세요.
Q3. 차트를 한 행에 3개씩 배치하려면 어떻게 하나요?
Mod 연산자를 사용합니다. 예제 코드에서는 (i - 1) Mod 3 = 2일 때 왼쪽 위치(intLeft)를 0으로 초기화하고 위쪽 위치(intTop)를 차트 높이만큼 증가시켜 다음 줄로 넘어갑니다.
마치며
차트를 하나씩 만들던 수고가 옵션 단추 한 번으로 끝납니다. 예제 파일에서 직접 눌러 보세요!
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.