- 최초 작성일: 2001-12-26
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA로 피벗테이블 건들기4
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지난 강좌 가운데 하나를 보시고 한 독자분께서 보내 주신 메일의 일부입니다. (개인 정보는 가렸습니다.)
…(중략)… 저는 은행에 다니는 정OO라고 합니다.
공적자금을 무한정 먹고도 이제는 목숨이 얼마 남지 않은 은행이지요
흡수합병이 오늘 내일 하는 상태지요. 국민들에게 늘 미안한 마음이
많습니다. 제가 뭐 책임질 수 있는 자리에 있지 않지만요.
선생님의 강의에 대해 늘 감사하구요 감사의 편지 한번 쓴다 하면서도
미루었군요. 이제는 VBA에 푹빠져 버렸습니다.
틈만나면 인쇄해 놓은 선생님의 강의를 본답니다.
올해8월말에 선생님의 홈을 발견해내고 9월1일부터 시작했지요.
처음에는 무조건 외우고 나서 모듈시트에 기록해 보았습니다.
vb0001-50까지는 두번보았고 오늘은 Vb0087을 마쳤습니다.
오늘 강의에 나오는 선생님의 말씀이 다시금 용기를 가지게 해주는군요
21일이니 한달만에 끝낼수 있다면 도전할 가치도 없다는 말씀.
이젠 웬만한 코드는 안보고도 직접 만들수도 있지요(물론 단순한 것만)
예전에 여러 site에서 VBA를 배우려고 받아본 어려운(?) 코드를 보면
이젠 이해할 수 있게 되었습니다.
질문을 드릴려고 한건 아니지만 이왕 메일을 쓰는 김에 한가지.
VBA 모듈 코드를 어떻게 숨기는지 알려줄수 있겠습니까?
뭐 숨길만한 능력이 있는것도 아니지만 그 구조나 방법이 늘
궁금했습니다… (하략)…
고수 한분 나셨습니다! 이 분은 머지 않은 장래에 반드시 고수로 등극하실 것입니다. "공적 자금이 무한정 투입되고서도 인수합병이 오늘내일" 하는 형편이시라니 안타까운 마음을 금할 길이 없습니다. 왜 사고는 꼭 윗사람이 치고 뒷수습은 맨날 아랫 사람이 지게 되는지 모르겠습니다. 고통 분담까지는 아니더라도 최소한 고통 전담이 되어서는 되지 않을텐데 말입니다.
어떤 난관이 닥치더라도 믿을 것은 자기 자신밖에 없습니다. 어떤 상황 하에서라도 살아남기 위해서는 평소에 부단히 자기 계발을 하는 수밖에 다른 도리가 없지요. 특히 별다른 생산 수단을 갖고 있지 않다면 말입니다. 환경 탓 말고 자신을 연마해 나간다면 언젠가는 빛을 보게되는 날이 반드시 올 것입니다.
VBA로 피벗테이블 건들기4
핵심 요약: 설문 조사 피벗 분석 자동화
설문 결과 시트의 문항 수만큼 피벗 테이블을 순환문으로 만들고 응답 빈도와 비율을 계산하면 설문 분석을 몇 초 만에 끝낼 수 있습니다.
- 1단계: 이미 있는 결과분석 시트를 확인하고 새 시트를 만듭니다.
- 2단계: 문항마다 CreatePivotTable로 피벗 테이블을 만들고 빈도와 비율을 계산합니다.
- 3단계: Replace로 1~5 숫자를 척도 문자로 바꾸고 서식을 정리합니다.
VBA 코드 숨기기
VBA 코드를 숨기는 방법은 아주 간단합니다. VB Editor 상태에서 숨기시려는 프로젝트를 오른쪽 마우스 버튼으로 클릭합니다. 그러면 그림과 같이 단축 메뉴가 나타나는데 'VBProject 속성' 메뉴를 선택하고 '보호' 탭을 선택하신 다음 암호를 지정해 주시면 됩니다.
모쪼록 깊이 상심하시는 일이 없기를 바랍니다.
설문 조사 결과를 피벗 테이블로 분석하기
요즘 주변에서 On-line을 이용하여 설문 조사를 하는 경우를 자주 봅니다. 대개의 경우, 설문 조사 결과를 어떤 식으로 분석을 하시는지 잘 모르겠지만 피벗 테이블을 사용하면 아주 간편하게 결과를 요약, 분석할 수 있습니다. (오늘 예제는 J.Walkenbach님의 데이터를 약간 수정한 것입니다) 버튼을 눌러 예제를 살펴보고 오세요.
말 그대로 순식간에 처리가 되지요? 똑같은 일을 두 사람에게 시켰는데 한 사람은 5분만에 뚝딱해 치우고 놀고 있는데(논다기 보다 다른 사람과 교류 ^^) 다른 사람은 2시간이 지났는데도 땀 뻘뻘 흘려가며 부지런히 계산기와 키보드를 두들기고 있다면 여러분은 어떤 사람한테 점수를 더 주시겠습니까?
그야 당연히... 후자라구요? 당연히 그렇게 되어야 하나 책상머리에 앉아있는 시간만을 가지고 평가를 하는 곳이 아직은 많이 있는 듯 합니다. 신문 지상을 덮고있는 수많은 조직들을 보면 그런 생각이 절로 듭니다. 엑셀과 VBA(사실은 컴퓨터 그 자체가 그렇습니다만)의 가장 큰 특성이 효율성 추구, 중복의 배제입니다. 엑셀과 VBA를 통해 이런 기본 원칙을 조금만이라도 습득을 한다면 불미스런 일로 신문을 덮게 되지는 않을텐데…
그건 그렇고… 코드를 보도록 하지요.
MakeSummarySheet 프로시저
Sub MakeSummarySheet()
Dim pvtPCache As PivotCache
Dim pvtPTable As PivotTable
Dim shtPivot As Worksheet
Dim strItem As String, Msg As String
Dim r As Integer, i As Integer
'''등장 인물 및 배역을 설정하는 부분입니다.
For Each shtPivot In Worksheets
If shtPivot.Name = "결과분석" Then
Msg = Msg & "같은 시트가 이미 존재합니다" & vbCr
Msg = Msg & "지우고 다시 만들까요?"
If MsgBox(Msg, vbYesNo, "동일 시트 발견//By Exceller") = vbYes Then
Application.DisplayAlerts = False
shtPivot.Delete
Application.DisplayAlerts = True
Else
MsgBox """아니오""를 선택하셨으므로 아무 작업도 하지 않았습니다"
Exit Sub
End If
'''설문 결과를 분석할 시트를 만듭니다. 이 때 기존에 만들어 진 것이 있으면
'''사용자에게 알려주고 시트를 다시 만들 것인지의 여부를 결정토록 합니다.
End If
Next shtPivot
Set shtPivot = Worksheets.Add
With shtPivot
.Name = "결과분석"
.Move after:=Sheets(Sheets.Count)
'''시트를 새로 한장 삽입하고 시트 이름을 "결과분석"이라고 줍니다.
'''시트를 삽입할 위치는 현재 워크시트의 마지막 부분이 됩니다.
End With
Set pvtPCache = ActiveWorkbook.PivotCaches.Add _
(SourceType:=xlDatabase, _
SourceData:=Sheets("설문결과").Range("A1"). _
CurrentRegion.Address)
'''피벗 캐시 오브젝트를 생성하는 것에 대해서는 몇 강좌 전에 설명을 드리고
'''넘어왔나 그냥 넘어왔나? 기억이 가물가물한데… 형식이 거의 정해져 있습니다.
'''SourceType이라는 것은 피벗 테이블의 원본 데이터 형식을 의미하는 것이고,
'''SourceData는 말 그대로 피벗 테이블을 만들 원본 데이터의 위치를 알려주는
'''것입니다.
r = 1
For i = 1 To 10
strItem = Sheets("설문결과").Cells(1, i + 2)
Set pvtPTable = pvtPCache.CreatePivotTable _
(TableDestination:=shtPivot.Cells(r, 1), _
TableName:=strItem)
r = r + 12
'''이 부분이 중요합니다. 피벗 테이블을 생성하는데 어디에다 생성을 하느냐 하면
'''shtPivot 시트, 그러니까 새로 삽입한 워크시트에다 생성을 하는 것입니다.
'''이 때 각 문항마다 별도의 피벗 테이블로 분석을 하기 위해 순환문을 사용하여
'''반복 작업을 합니다. r = r+12 에서 12를 더해 준 이유는 그냥 피벗 테이블이 겹치지
'''않도록 하기 위한 것입니다.
'''나머지 아래 부분은 지난 강좌에서 많이 다루어 본 내용이지요?
'''Orientation 속성을 사용하여 데이터를 어느 필드에 넣을 것인지를 결정하는
'''것입니다. 그러면 이 모든 속성값을 다 외워야 하느냐? 절대로 그렇지가 않습니다.
'''매크로 기록기를 켜 놓고 수작업을 한 다음 코드를 조금씩 수정해 나가면 되는
'''것입니다.
With pvtPTable.PivotFields(strItem)
.Orientation = xlDataField
.Name = "응답 빈도"
End With
With pvtPTable.PivotFields(strItem)
.Orientation = xlDataField
.Name = "비율(%)"
.Calculation = xlPercentOfTotal
End With
With pvtPTable
.AddFields RowFields:=Array(strItem, "데이터")
.PivotFields("성별").Orientation = xlColumnField
.PivotFields("데이터").Orientation = xlColumnField
.Format xlTable6
End With
Next i
shtPivot.Select
With Columns(1)
.Replace What:="1", Replacement:="매우 그렇다", LookAt:=xlWhole
.Replace What:="2", Replacement:="그런 편이다", LookAt:=xlWhole
.Replace What:="3", Replacement:="보통이다", LookAt:=xlWhole
.Replace What:="4", Replacement:="그렇지 않다", LookAt:=xlWhole
.Replace What:="5", Replacement:="매우 그렇지 않다", LookAt:=xlWhole
'''보통 설문지를 작성할 때 5점 척도법을 많이 사용합니다. 숫자로 1, 2, 3, 4, 5로
'''표기한 것을 문자로 바꾸어 줍니다.
'''아래의 코드는 생성된 피벗 테이블 시트의 서식을 꾸미고 메시지 박스를 띄우기
'''위한 것이므로 설명은 생략합니다.
End With
With Columns
.EntireColumn.AutoFit
.Font.Name = "굴림"
.Font.Size = 11
End With
On Error Resume Next
Application.CommandBars("PivotTable").Visible = False
On Error GoTo 0
ActiveWorkbook.ShowPivotTableFieldList = False
Application.DisplayAlerts = True
Msg = Space(0)
Msg = Msg & "설문 항목별 분석을 완료하였습니다" & vbCr
Msg = Msg & "말 그대로 순식간에 해치워 버렸지요?"
MsgBox Msg, , "문항별 분석 완료//By Exceller"
End Sub
마무리
이제 VBA로 피벗 테이블은 고만 건들까요? ^^ 오늘은 여기까지…
정리 — 설문 분석 피벗 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 피벗 캐시 | PivotCaches.Add SourceType:=xlDatabase | 설문 원본 데이터 지정 |
| 문항별 생성 | For i = 1 To 10 … CreatePivotTable | 문항마다 피벗 테이블 생성 |
| 비율 계산 | .Calculation = xlPercentOfTotal | 응답 비율(%) 계산 |
| 척도 변환 | Columns(1).Replace … LookAt:=xlWhole | 1~5를 문자로 변환 |
| 코드 보호 | VBProject 속성 > 보호 탭 | 암호로 VBA 코드 숨김 |
자주 묻는 질문 (FAQ)
Q1. VBA 코드를 다른 사람이 못 보게 숨기려면 어떻게 하나요?
VB Editor에서 프로젝트를 오른쪽 마우스로 클릭해 VBProject 속성을 선택하고 보호 탭에서 암호를 지정합니다.
Q2. 설문 문항이 많을 때 피벗 테이블을 일일이 만들어야 하나요?
순환문 안에서 CreatePivotTable을 반복 호출하면 문항마다 별도의 피벗 테이블을 자동으로 만들 수 있습니다.
Q3. 피벗 테이블 코드를 모두 외워야 하나요?
매크로 기록기를 켜고 수작업을 한 다음 기록된 코드를 조금씩 수정해 나가면 됩니다.
마치며
순환문과 피벗 테이블을 결합하면 반복적인 설문 분석을 순식간에 처리할 수 있습니다.