- 최초 작성일: 2001-12-05
- 최종 수정일: 2026-09-30
- 조회수: 12 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA로 피벗 테이블 건들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
눈치가 빠른 분은 짐작하셨을 테지만(앗! 강좌 제목을 보니 눈치가 빠르지 않아도 아실 듯 합니다 ^^), 이번 시간에 살펴볼 내용은 피벗 테이블에 대한 것입니다.
누가 Exceller에게, "Excel은 어떤 점이 다른 스프레드시트에 비해 뛰어납니까?" 라고 질문하신다면, 한 30분 동안 엑셀이 가진 여러 가지 뛰어난 기능과 VBA 엔진, 배열 수식(물론 배열 수식을 최초로 도입한 스프레드시트가 엑셀은 아니지만...) 등에 대해 거품(?)을 물고 설명을 한 다음, 최종적으로 언급하게 될 부분이 바로 "피벗 테이블" 기능이 되지 않을까 생각합니다.
정말이지 엑셀의 피벗 테이블은 그 기능이 Powerful 합니다. 책에서도 언급했듯이, 한마디로 정의하자면 "다이나믹 요약 보고서" 입니다.
흔히 투자를 할 때 ROI(Return On Investment, 투자회수 능력)라는 지표를 따지곤 하는데, 그런 측면에서 보자면 엑셀의 기능들 중에서 ROI가 가장 높은 기능이 바로 피벗 테이블이 아닐까 싶습니다. 배우기도 쉬운 반면, 여러 분야에서 다각도로 응용하기가 그만큼 용이하다는 의미이지요.
앞으로 몇 강좌 동안은 Exceller가 그렇게 좋다고 외치고(?) 다니는 피벗 테이블의 모든 것(… 이라기 보다 Exceller가 아는 범위 내에서의 모든 것!)에 대해 함께 살펴 보도록 하겠습니다. ("피벗 테이블?? 그게 머하는 건데요?" 혹시 이런 분이 계시다면 얼른 X0037, 38, 68, 69, 70 강좌를 읽어보고 다시 오시기 바랍니다)
VBA로 피벗 테이블 건들기
핵심 요약: VBA로 피벗 테이블 만들기
매크로 기록기로 만든 코드는 이해하기 어렵기 때문에 PivotCache와 PivotTable 변수를 사용해 필드 방향(Orientation)을 지정하는 간결한 코드로 바꾸어 사용합니다.
- 1단계: 매크로 기록기로 피벗 테이블을 만들어 기본 코드를 얻습니다.
- 2단계: PivotCaches.Add와 CreatePivotTable로 캐시와 피벗 테이블을 만듭니다.
- 3단계: PivotFields의 Orientation으로 필드를 행/열/페이지/데이터에 배치합니다.
Step 1: 예제 데이터와 피벗 테이블
피벗 테이블에 사용할 간단한 예제 테이블(데이터)을 먼저 만들어 둡니다.
예제 데이터 펼쳐 보기 (Branch / BrandName / Month / Sales_AMT)
| Branch | BrandName | Month | Sales_AMT |
|---|---|---|---|
| 강동 | 아이오페 | 1월 | 8700 |
| 강동 | 아이오페 | 2월 | 500 |
| 강동 | 아이오페 | 3월 | 5600 |
| 강동 | 라네즈 | 1월 | 2800 |
| 강동 | 라네즈 | 2월 | 6100 |
| 강동 | 라네즈 | 3월 | 1000 |
| 강동 | 마몽드 | 1월 | 6800 |
| 강동 | 마몽드 | 2월 | 900 |
| 강동 | 마몽드 | 3월 | 1700 |
| 강남 | 아이오페 | 1월 | 1300 |
| 강남 | 아이오페 | 2월 | 7500 |
| 강남 | 아이오페 | 3월 | 300 |
| 강남 | 라네즈 | 1월 | 10000 |
| 강남 | 라네즈 | 2월 | 300 |
| 강남 | 라네즈 | 3월 | 600 |
| 강남 | 마몽드 | 1월 | 1400 |
| 강남 | 마몽드 | 2월 | 6800 |
| 강남 | 마몽드 | 3월 | 1300 |
| 영등포 | 아이오페 | 1월 | 7400 |
| 영등포 | 아이오페 | 2월 | 8500 |
| 영등포 | 아이오페 | 3월 | 1200 |
| 영등포 | 라네즈 | 1월 | 600 |
| 영등포 | 라네즈 | 2월 | 3300 |
| 영등포 | 라네즈 | 3월 | 6200 |
| 영등포 | 마몽드 | 1월 | 8600 |
| 영등포 | 마몽드 | 2월 | 9500 |
| 영등포 | 마몽드 | 3월 | 900 |
| 종로 | 아이오페 | 1월 | 4700 |
| 종로 | 아이오페 | 2월 | 6000 |
| 종로 | 아이오페 | 3월 | 4800 |
| 종로 | 라네즈 | 1월 | 5500 |
| 종로 | 라네즈 | 2월 | 5400 |
| 종로 | 라네즈 | 3월 | 600 |
| 종로 | 마몽드 | 1월 | 400 |
| 종로 | 마몽드 | 2월 | 400 |
| 종로 | 마몽드 | 3월 | 400 |
| 동대문 | 아이오페 | 1월 | 5600 |
| 동대문 | 아이오페 | 2월 | 5300 |
| 동대문 | 아이오페 | 3월 | 4300 |
| 동대문 | 라네즈 | 1월 | 2700 |
| 동대문 | 라네즈 | 2월 | 6800 |
| 동대문 | 라네즈 | 3월 | 7000 |
| 동대문 | 마몽드 | 1월 | 2900 |
| 동대문 | 마몽드 | 2월 | 4100 |
| 동대문 | 마몽드 | 3월 | 1000 |
| 경서 | 아이오페 | 1월 | 3400 |
| 경서 | 아이오페 | 2월 | 3100 |
| 경서 | 아이오페 | 3월 | 7400 |
| 경서 | 라네즈 | 1월 | 6300 |
| 경서 | 라네즈 | 2월 | 3900 |
| 경서 | 라네즈 | 3월 | 6700 |
| 경서 | 마몽드 | 1월 | 3500 |
| 경서 | 마몽드 | 2월 | 100 |
| 경서 | 마몽드 | 3월 | 6900 |
이 데이터를 가지고 아래와 같은 형태의 피벗 테이블을 만들어 보세요. ("이 데이터를 가지고 피벗 테이블을 어떻게 만드는 건데요?" 이런 분도 얼른 X0037, 38, 68, 69, 70 강좌를 읽어보고 다시 오시기 바랍니다)
Step 2: 매크로 기록기로 코드 만들기
만드시겠지요? 몇 번 연습해 본 다음, 이번에는 "매크로 기록기"를 사용하여 VBA 코드를 자동으로 만들어 보도록 하겠습니다. "도구-매크로-새 매크로 기록" 메뉴를 선택하신 다음, 위와 같은 피벗 테이블을 작성해 보세요. 매크로 기록기는 일종의 녹음기이므로 불필요한 키보드나 마우스 조작은 삼가해야 한다는 것은 아시지요?
제대로 기록을 하였다면 아마 아래와 같은 코드가 자동으로 생성되어져 있을 것입니다. 항상 생각하는 것이지만 엑셀(VBA)은 대단하다는 생각이 듭니다. 마우스로 버튼만 몇 번 딸깍 거렸을 뿐인데, 어떻게 그것을 자동화 시켜주는 것인지…
너무 바쁜 나머지 피벗 테이블을 만들 시간조차 없는 분을 위해 내친 김에 코드까지 만들어 드리도록 하지요. 참 친절도 하다!!!
Sub Macro1()
'
' Macro1 Macro
' Exceller이(가) 2001-12-05에 기록한 매크로
'
'
Range("A35").Select
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Preface!R34C1:R88C4").CreatePivotTable TableDestination:="", TableName:= _
"피벗 테이블1"
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
ActiveSheet.PivotTables("피벗 테이블1").AddFields RowFields:="Branch", _
ColumnFields:="Month", PageFields:="BrandName"
ActiveSheet.PivotTables("피벗 테이블1").PivotFields("Sales_AMT").Orientation = _
xlDataField
ActiveWorkbook.ShowPivotTableFieldList = True
End Sub
매크로 기록기를 이용하면 좋긴 한데… 모든 것을 곧이 곧대로 기록하니까 이대로는 뭐가 뭔지 파악하기가 쉽지 않습니다. 따라서 이것을 수정해 주어야 하는데 그러기 위해서는 피벗 테이블을 구성하고 있는 오브젝트나 프로퍼티 등에 대한 기본적인 지식이 좀 필요합니다.
위의 코드 중에서 노란색으로 표기한 다섯 개의 오브젝트(내지는 컬렉션), 즉 PivotCaches, CreatePivotTable, PivotTableWizard, PivotTables, PivotFields에 대해서는 도움말을 반드시 찾아보시기 바랍니다.
Step 3: 좀더 효율적인 코드로
이제 위의 단순 무식한 코드를 좀더 효율적인 코드로 바꾸어 보도록 합니다. VBA에 숙달이 되면 오브젝트의 프로퍼티나 메서드 등이 생각나지 않을 때 잠깐씩 매크로 기록기를 이용하지 위에서와 같은 방법은 사실 잘 사용하지 않습니다(Exceller의 주관적인 판단… ^^).
아래의 버튼을 눌러 보세요.
매크로 기록기를 사용해서 작성한 코드와 동일한 작업을 수행하지요? 코드를 보도록 하지요. 뭔지 모르지만 훨씬 간결하고 잘 이해할 수 있을 것 같은 기분이 드시지요? 이 코드가 위의 코드보다 훨씬 효율적이라고 할 수 있을 것입니다.
Sub CreatePivotTableByExceller()
Dim pvtPCache As PivotCache
Dim pvtPTable As PivotTable
Dim rngStart As Range
Set rngStart = Sheets("Preface").[A35]
Set pvtPCache = ActiveWorkbook.PivotCaches.Add _
(SourceType:=xlDatabase, _
SourceData:=rngStart.CurrentRegion.Address)
Worksheets.Add
Set pvtPTable = pvtPCache.CreatePivotTable _
(tabledestination:=ActiveSheet.[A3], _
tablename:="피벗 테이블1")
With pvtPTable
.PivotFields("BrandName").Orientation = xlPageField
.PivotFields("Branch").Orientation = xlRowField
.PivotFields("Month").Orientation = xlColumnField
.PivotFields("Sales_AMT").Orientation = xlDataField
End With
End Sub
코드 자체는 별도의 설명이 필요없을 듯 합니다. 이해가 안되는 부분이 있으면 질문주시기 바랍니다. 다음 시간에는 이 코드를 가지고 좀더 응용을 할 것이니까 잘 살펴보시기 바랍니다. 그리고 한번 보고 휙 집어던지지 말고 잘 보관해 두세요.
오늘은 여기까지…
정리 — 피벗 테이블 VBA 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 캐시 만들기 | PivotCaches.Add(SourceType:=xlDatabase, SourceData:=...) | 원본 데이터 캐시 |
| 피벗 테이블 생성 | pvtPCache.CreatePivotTable | 피벗 테이블 개체 생성 |
| 행 필드 | .PivotFields("Branch").Orientation = xlRowField | 지점을 행으로 |
| 열 필드 | .PivotFields("Month").Orientation = xlColumnField | 월을 열로 |
| 데이터 필드 | .PivotFields("Sales_AMT").Orientation = xlDataField | 판매금액 집계 |
자주 묻는 질문 (FAQ)
Q1. 매크로 기록기를 쓰면 되는데 왜 코드를 수정하나요?
매크로 기록기는 모든 것을 곧이곧대로 기록하기 때문에 코드를 파악하기 어렵고 효율적이지 않으므로 오브젝트 변수를 사용해 간결하게 고칩니다.
Q2. 피벗 테이블은 무엇인가요?
한마디로 다이나믹 요약 보고서입니다. 엑셀의 기능 중에서도 배우기 쉽고 다양하게 응용할 수 있어 ROI가 높은 기능입니다.
Q3. 피벗 테이블 코드를 잘 이해하려면 무엇을 봐야 하나요?
PivotCaches, CreatePivotTable, PivotTableWizard, PivotTables, PivotFields 오브젝트와 컬렉션의 도움말을 반드시 참고하시기 바랍니다.
마치며
피벗 테이블은 엑셀에서 ROI가 가장 높은 기능이며, VBA로 다루면 그 활용 범위가 더욱 넓어집니다.