본문 바로가기
데이터 분석/etc

엑셀 매크로(VBA)를 이용하여 피벗테이블 구현하기

by gokite 2022. 4. 13.

VBA를 배워야 하는 이유

문제 발단

EXCEL 어느 단축키 하나 모른 채 모든 걸 손으로 하는 친구를 위해 

단기 속성 VBA 공부를 시작하는 데... (저번 편에서 계속)

 

 

문제 해결 

 

1. Application.ScreenUpdating = False

 매크로가 실행되는 동안 엑셀의 화면 동작을 중단하는 코드다. 엑셀은 주기적으로 화면을 갱신한다. 매크로 실행 중에 화면을 갱신하면 매크로의 속도가 떨어지는데 해당 코드를 사용하여 개선할 수 있다. 

1) 여러 시트 또는 여러 셀의 참조하여 매크로가 동작하거나 
2) 명령문이 실행되는 동안 차트/ 표 / 피벗테이블이 업데이트 돼야 하는 경우

에 자주 사용된다.

 

 

2. On Error Resume Next

1) On Error

 에러가 발생했을 경우 처리 방식을 결정하는 문이다.  뒤에 나오는 코드에 따라 처리 방식을 결정한다. 

2) On Error Resume Next

 에러가 발생해도 무시하고 다음 코드를 실행한다는 뜻이다.

< 에러 처리를 왜 해야하나? >
 엑셀의 경우 수 많은 변수 및 사용자의 수정으로 인해 에러가 없을 수가 없다. 하지만 일반 사용자에게 디버그문을 띄울 수 없기에 에러가 발생 가능한 상황에 적절한 에러 처리가 필요하다.
 예를 들어, Sheet1을 열어 작업하도록 지시해놨지만 그 사이 Sheet1의 이름이 바뀌었거나 삭제된 경우 "Sheet가 존재하지 않습니다" 라고 메세지를 띄워야지 디버그 처리하라고 할 수 없는 노릇이다. 

 

3. If Err <> 0 Then

    Sheets.Add(after:=Sheets(1)).Name = "PivotTable"

    Err.Clear

MsgBox "피벗테이블 시트가 이미 존재합니다." & vbCr & vbCr _
        & "기존 피벗테이블 시트를 삭제 후 재실행 하세요", 64, "시트 생성 에러"

1) <>

 같지 않다는 뜻이다. VBA에서는 흔히 사용하는 !=를 사용하지 않는다.

 

2) If Err <> 0 Then

 만약 위 코드가 에러였다면 다음 줄인 Sheets.Add를 실행한다는 뜻이다. 오류가 생겼다면 오류넘버가 0이 아닌 다른 값이므로 <> 0 은 오류가 발생했다는 가정문을 의미한다. 

< Error Number (오류 번호) > 
에러가 생기면 에러넘버(오류 번호)라는 게 활성화된다. 예를 들어 지정된 범위에 찾는 값이 없는 경우에는 #N/A라는 오류 값이 반환되고 이 오류의 번호는 2042다. 즉 오류가 생기면 오류종류에 따른 번호가 생길 수 밖에 없다. 

 

3) vbCr

 시스템에 정의되어 있는 상수다. vbCr이란 상수는 줄바꿈이 되도록 지정된 상수다.

 

4) 64

사용할 아이콘을 지정하는 상수다. 흰색 말풍선에 i 표시 [메세지 정보] 아이콘을 나타낸다.

 

4. Exit Sub

<End / Exit 차이>

Exit : 반복문과 같은 상황에서 벗어나기 위해 사용한다.

End : 프로그램 전체의 실행을 종료하기 위해 사용한다.

 

5. On Error GoTo 0

 에러가 발생할 때 임의처리하기 위한 코드명이다. 크게 두 가지로 사용된다.

  1) On Error GoTo 레이블명 (레이블이란 특정한 위치를 뜻함)

  에러가 발생하는 순간에 지정한 레이블로 이동하게 해준다.

  2) On Error GoTo 0

 기존 On Error문에 설정된 처리 방법을 해제하고, 초기화 한다는 뜻이다. 오류가 발생하면 0 이외의 값이 들어가게 되는데 0으로 초기화 시켜주는 것이다. (1)에 따르면 0을 입력하면 0행으로 이동해라 라는 의미이지만 0행이란 위치가 없으므로 기존 설정을 해제하라 라는 뜻이 된다.)

 

6. ActiveWorkBook.PivotCaches.Create{SourceType := xlDatabase, SourceData:= _

    rngAll, Version:=6).CreatePivotTable TableDestination := _

    rngT, Table Name:= "PivotTable", DefaultVersion :=6

1) PivotCaches 개체

 피벗테이블이 실제 참조하는 데이터를 의미한다. 피벗테이블은 데이터 원본에서 직접 작업하지 않고 pivot Cache에 자료를 저장 후 처리하는 절차를 거친다. 따라서 피벗테이블을 새로 고침하기 위해서는 Pivotcache를 갱신하는 작업이 필요하다.

 

2) PivotCaches.Create(SourceType, SourceData, Version)

 새로운 PivotCache 만든다.

옵션 필수 여부 의미 예시
SourceType 필수   xlConsolidation, xlDatabase, xlEternal 
( Range object일땐 xlConsolidation or xlDatabase,
 WorkbookConnection object일 땐 xlExternal)
SourceData 선택 사용할 데이터  
Version 선택 피벗테이블 버전 6, 12 (상수)

 

3) .CreatePivotTble(TableDestination, TableName, ReadData, DefaultVersion)

 새로운 피벗테이블을 만든다.

옵션 필수 여부 의미 예시
TableDestination 필수 피벗테이블 시작 위치  
TableName 선택 피벗테이블의 이름  
ReadData 선택 테이블 캐시 생성 유무 True / False
DefaultVersion 선택 피벗테이블 리포트 버전  

 

7. With Sheets("PivotTable1").PivotTables("PivotTables")

    .AddDataField.PivotFields(8), "합계", xlSum

    .PivotFields(1).Orientation = 1: .PivotFields(1).Position = 1

1) With Sheets("PivotTable1")

 개체를 반복 호출하지 않게 도와준다. With가 없다면,

 Sheets("PivotTable1").PivotTables("PivotTables")

 Sheets("PivotTable1").AddDataField.PivotFields(8),..(생략)

 Sheet("PivotTable1").PivotFields(1).Orientation = 1 ..(생략)

 라고 작성했을 것이다. 효율을 위해 사용하는 문법이다. 

 

2) .AddDataField.PivotFields

 피벗테이블에 데이터 필드를 추가한다.

옵션 필수 여부 의미 예시
Field 필수    
Caption 선택 데이터 필드 이름  
Function 선택 데이터 필드에 사용할 함수 xlSum, xlMax

 

4) PivotFields 개체

 숨겨진 필드 포함 모든 PivotField(피벗테이블 리포트 상의 필드)의 컬렉션이다.

PivotFields(8)이라고 한다면, 8번쨰인 H열을 의미한다. 

 

5) .Orientation 

 피벗테이블 상의 필드의 위치를 의미한다.

 

6). .Position

 필드의 위치를 반환한다. (첫번째, 두번째 세번째..)

 

 

느낀 점

 어느 언어를 쓰든, 어떤 목적이든 항상 사용하는 사람을 배려하는 코드를 짜야겠다는 생각이 들었다. 내 입장에서 생각하지말고 사용자 입장에서 편할 수 있는 경로를 생각하고, 예상하며 짜야겠다. 어느 일이든 사람과 소통을 하려고 노력하는 태도가 참 중요한 것 같다.

 세상에는 개발자보다 비개발자가 많다. 소통이 안 되는 상황을 탓하지 않고, 내가 어떤 방식으로 다가갈 지, 목표를 공유할 지, 합의를 할 것인지를 먼저 고려하는 사람이 될 거다. 

 

 

 

참고 링크

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rosa0189&logNo=60152271252

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yungth&logNo=220704907065

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=smilo73&logNo=220304995739

https://www.oppadu.com/vba-application-screenupdating/