오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴
실무자 기초 강의

피벗테이블 자동 업데이트 완벽정리

오빠두엑셀 by 오빠두엑셀
  • 학습시간 14분
  • 난이도 중급
  • 작성일 2020.04.22

복사 붙여넣기로 누구나 할 수 있는 피벗테이블 자동 업데이트, 기초-응용-문제해결 까지 총정리!

이 강의에서는 피벗테이블의 원본 데이터가 변경될 때마다 자동으로 새로고침되도록 VBA 매크로로 구현하는 방법을 다룹니다. 같은 시트와 다른 시트 두 가지 상황에 맞춘 명령문을 단계별로 살펴보고, 데이터 삭제 시에도 이전 단계로 되돌릴 수 있도록 보완하는 코드까지 정리하여 실무 데이터에서도 안정적으로 동작하도록 구성합니다.

피벗테이블 자동 업데이트 완벽정리
DOWNLOADS

실습자료를 준비했어요

수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇

영상강의
패치노트
  • 2020.04.23 :
    셀의 내용을 삭제한 경우에도 횟수에 상관없이 이전 단계로 되돌릴 수 있도록 전체 명령문을 업데이트
    하였습니다. 자세한 내용은 세 번째 항목을 참고해 주세요.
  • 2020.04.23 추가 :
    댓글로 문의주신 분이 많아, 완성파일 시트를 두 개로 분리하였습니다. 완성파일을 다운로드하면 두 개의 시트가 포함되어 있습니다.
    [완성예제#1] 시트에는 데이터 추가/삭제 시 모두 실시간으로 업데이트되는 명령문이 입력되어 있습니다. 다만 데이터 삭제 후에는 이전 단계로 되돌릴 수 없다는 단점이 있습니다.
    [완성예제#2] 시트는 데이터 추가 시에만 실시간으로 업데이트됩니다. 데이터 삭제 후에도 횟수에 상관없이 이전 단계로 되돌릴 수 있습니다.

강의 설명

실무자가 엑셀에서 가장 많이 사용하는 기능 중 하나가 바로 피벗테이블입니다. 피벗테이블은 데이터를 요약하는 강력한 도구이지만, 원본 데이터가 변경되어도 실시간으로 갱신되지 않는다는 한계가 있습니다. 그러다 보니 주기적으로 자료가 추가되는 데이터에서는 매번 직접 새로고침을 해야 하는 번거로움이 따랐습니다.

엑셀 데이터 새로고침

그렇다면 피벗테이블 자동 업데이트를 손쉽게 구현할 방법은 없을까요?

엑셀 피벗테이블 자동 업데이트 예제

이번 강의에서는 명령문 복사·붙여넣기만으로 적용할 수 있는 상황별 피벗테이블 자동 업데이트 방법을 3단계로 나누어 자세히 살펴봅니다.

피벗테이블 자동 새로고침 단계별 알아보기

원본 데이터가 피벗테이블과 같은 시트에 있는 경우, 원본 데이터에 새로운 자료가 추가될 때마다 피벗테이블도 함께 업데이트되어야 합니다. 그래야 사용자에게 실시간으로 반영되는 모습을 보여줄 수 있습니다.

따라서 워크시트의 'Change' 이벤트를 사용하여 명령문을 작성합니다.

  1. 원본 데이터와 피벗테이블이 위치한 시트명을 확인합니다.
    예제파일에서는 '예제1' 시트에 피벗테이블을 작성해 두었습니다.
  2. 엑셀 화면 상단의 '개발도구' 탭에서 'Visual Basic'을 클릭하거나, 키보드 Alt + F11 단축키를 눌러 매크로 편집기로 이동합니다.
    화면 상단에 개발도구 탭이 보이지 않는 경우 아래 개발도구 활성화 방법 포스트를 참고하세요.
  3. 매크로 편집기 좌측 프로젝트 창의 'Microsoft Excel 개체' 목록에는 현재 통합문서에 포함된 시트가 나열됩니다. 이 중 자동 업데이트를 적용할 시트를 더블클릭하여 시트 명령문 창으로 이동합니다.

    엑셀 피벗테이블 자동 업데이트 시트 이동

  4. 우측 편집기 상단에서 '(일반)' 항목을 'Worksheet'로 변경합니다.

    시트 개체 선택

  5. 이어서 (선언) 항목에서 'Change' 이벤트를 선택합니다.

    시트 Chage 이벤트 선택

  6. 그러면 Worksheet_Change 라는 이벤트 명령문이 자동으로 생성됩니다.

    피벗테이블 자동 업데이트 명령문 추가

  7. 아래 코드를 복사하여 Worksheet_Change 명령문 안에 붙여넣기합니다.
    Dim pvTbl As PivotTable
     
    Application.EnableEvents = False
    For Each pvTbl In Me.PivotTables
        pvTbl.RefreshTable
    Next
    Application.EnableEvents = True
  8. 이로써 피벗테이블 자동 업데이트 설정이 완료되었습니다. 해당 시트에서 원본 데이터를 변경하면 피벗테이블이 실시간으로 자동 갱신됩니다.

    엑셀 피벗테이블 자동 업데이트 예제

  9. 완성된 파일은 매크로가 포함된 파일이므로 'Excel 매크로 사용 통합문서(*.xlsm)' 형식으로 저장합니다.

    매크로 통합문서 저장

그렇다면 원본 데이터와 피벗테이블이 서로 다른 시트에 있는 경우는 어떻게 처리해야 할까요? 앞서와 동일하게 피벗테이블을 실시간으로 업데이트해야 할까요?

그렇지 않습니다.

피벗테이블이 원본 데이터와 다른 시트에 있다면, 새로운 데이터를 추가한 뒤 피벗테이블 시트로 이동하는 시점에 한 번만 업데이트해 주어도 실시간 갱신과 동일한 효과를 얻을 수 있습니다.

따라서 원본 데이터와 피벗테이블이 다른 시트에 있는 경우에는 워크시트의 'Activate(활성화)' 이벤트를 사용하여 자동 업데이트를 구현합니다.

  1. 매크로 편집기에서 피벗테이블이 위치한 시트를 더블클릭하여 시트 모듈로 이동합니다.

    피벗테이블 시트 이동

  2. '(일반)' 항목에서 Worksheet, '(선언)' 항목에서 Activate를 선택합니다.

    피벗테이블 자동 업데이트 매크로 Activate

  3. 아래 코드를 복사하여 'Worksheet_Activate' 명령문 안에 붙여넣기합니다.
    Dim pvTbl As PivotTable
     
    Application.EnableEvents = False
    For Each pvTbl In Me.PivotTables
        pvTbl.RefreshTable
    Next
    Application.EnableEvents = True
  4. 이로써 원본 데이터와 피벗테이블이 다른 시트에 있을 때의 자동 업데이트 설정이 완료되었습니다. 원본 데이터에 자료를 추가한 뒤 피벗테이블 시트로 이동하면 피벗테이블이 자동으로 갱신됩니다.

    엑셀 피벗테이블 자동 업데이트 다른 시트 예제

  5. 완성된 파일은 매크로가 포함된 파일이므로 'Excel 매크로 사용 통합문서(*.xlsm)' 형식으로 저장합니다.

    매크로 통합문서 저장

매크로로 피벗테이블 자동 업데이트를 구현하면 한 가지 주의할 점이 있습니다. 바로 매크로가 동작한 시점부터 '실행 취소(이전 단계로 돌아가기)'가 모두 초기화된다는 점입니다.

새로운 자료를 추가하는 상황에서는 큰 문제가 없지만, 자료를 잘못 삭제하여 이전 단계로 되돌려야 하는 상황에서는 작업 손실로 이어질 수 있습니다.

이 문제는 명령문을 약간만 보완하면 어렵지 않게 해결할 수 있습니다. 아래 코드를 복사하여 시트 모듈에 붙여넣으면 데이터가 삭제된 경우에도 이전 단계로 되돌릴 수 있도록 동작합니다. (아래 명령문은 전체를 그대로 복사하여 시트 모듈에 붙여넣어야 합니다.)

단, 실행 취소를 진행할 때는 되돌리는 순서가 삭제된 순서와 동일해야 합니다. 즉, 이전 단계로 되돌리는 도중 키보드나 마우스로 다른 셀을 선택하거나 이동하면 되돌리기 기록이 초기화되므로 주의해야 합니다.

' nVal          : Change Event로 받아온 셀에 입력된 최종 값
' oVal          : Selection Change Event로 받아온 최종 수정 전 입력된 값
' tVal          : 삭제된 값이 원복된 것인지 확인하기 위한 임시 값
' DeleteFlag    : 셀이 삭제 될 경우 발동되는 Trigger
Dim nVal As Variant: Dim oVal As Variant
Dim DeleteFlag As Boolean: Dim tVal As Variant
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
oVal = Target.Value
 
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim pvTbl As PivotTable
 
' 오류가 발생할 경우 EH로 넘어가면서 명령문이 바로 종료됩니다.
On Error GoTo EH:
 
nVal = Target.Value
 
'  Target이 비어있을 경우 오류가 발생하면서 명령문 종료 (셀 완전 삭제시)
If nVal <> "" Then
    ' DeleteFlag (셀 삭제여부 Trigger) 가 False 이거나 빈칸일 경우 피벗테이블 업데이트를 진행합니다.
    If DeleteFlag = False Or IsEmpty(DeleteFlag) Then
        If oVal <> nVal Then
            Application.EnableEvents = False
            For Each pvTbl In Me.PivotTables
                pvTbl.RefreshTable
            Next
            Application.EnableEvents = True
        End If
    Else
        Select Case True
            ' DeleteFlag가 True이고 새로입력된값 = 임시값 이면 Pass
            Case nVal = tVal
            ' DeleteFlag가 True이고 임시값 = 이전값일 경우 삭제된 값이 복원된 상태이므로
            ' 임시값을 새로운 값으로 치환하고 Pass
            Case oVal = tVal
                tVal = nVal
            ' 위 두가지 상황이 아닐 경우 새로 입력된경우이므로 피벗테이블 업데이트 후 DeleteFlag 를 False로 리턴
            Case Else
            Application.EnableEvents = False
            For Each pvTbl In Me.PivotTables
                pvTbl.RefreshTable
            Next
            Application.EnableEvents = True
            DeleteFlag = False
        End Select
    End If
Else
    If DeleteFlag = False Or IsEmpty(DeleteFlag) Then
        DeleteFlag = True
        tVal = oVal
    Else
        tVal = oVal
    End If
End If
 
Exit Sub
EH:
 
End Sub

위 명령문을 사용할 때 한 가지 주의 사항이 있습니다.

'셀을 완전히 삭제하는 작업'(우클릭 후 삭제 또는 단축키 Ctrl + - 키)은 횟수에 상관없이 이전 단계로 되돌릴 수 있습니다.

엑셀 피벗테이블 셀 완전히 삭제 이전단계 돌아가기

다만 '셀 안의 내용만 지우는 작업'(← 또는 Delete 키)은 한 번만 되돌리기가 가능하다는 점에 유의해야 합니다. 셀 내용만 지운 작업을 되돌리는 과정에서 셀에 값이 다시 입력되면서 매크로가 실행되기 때문입니다. 이로 인해 피벗테이블 자동 업데이트 매크로가 동작하면서 이전 작업 기록이 초기화됩니다.

엑셀 피벗테이블 셀 내용만 삭제 이전단계 돌아가기 문제

댓글 144
4.9 (78개 평가)
cynnano
cynnano 2020.04.23 09:18
오늘 유튭으로 강의를 들었는데요. 넘 좋은 내용이었습니다. 감사드립니다. ^^
0ugi
0ugi 2020.04.23 10:57
감사합니다. 매크로사용시 실행취소가 안되는것까지 고려하시고..^^ 잘 배워갑니다!
글래스
글래스 2020.04.23 13:05
Dim nVal As Variant: Dim oVal As Variant


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

oVal = Target.Value

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Dim pvTbl As PivotTable

' 오류가 발생할 경우 EH로 넘어가면서 명령문이 바로 종료됩니다.
On Error GoTo EH:

' Target이 비어있을 경우 오류가 발생하면서 명령문 종료 (셀 완전 삭제시)
If Target.Value "" Then
' Target의 값이 빈칸("")일 경우 IF문 통과 못하고 명령문 종료 (셀 내용만 지울경우)
' 이전값과 새로운값을 비교하여, 이전값이 빈칸이 아니고 (삭제한 값이 리턴됨)
' 그리고 현재 값이 empty(기존에 값이 삭제된 경우)가 아닐때에만 명령문 실행
If Not (IsEmpty(nVal) And oVal "") Then
Application.EnableEvents = False
For Each pvTbl In Me.PivotTables
pvTbl.RefreshTable
Next
Application.EnableEvents = True
End If
End If

Exit Sub
EH:

End Sub

이걸 다 긁어서 넣으라는 걸까요? 다 넣으니깐 안되는 것 같아서요 ㅠ
오빠두엑셀
오빠두엑셀 작성자 2020.04.23 13:31
안녕하세요?^^ 네 맞습니다.
1. 피벗테이블이 있는 시트개체를 더블클릭합니다.
2. 안에 명령문이 있다면 모두 지워주세요.
3. 아래 명령문을 복사하여 붙여넣기합니다.

세번째로 알려드린 셀 내용 삭제시의 이전단계로 돌아가기 문제 해결을 위한 코드는 '원본데이터와 피벗테이블'이 같은 시트에 있을경우에만 적용하시면 됩니다.
원본데이터와 피벗테이블이 다른 시트에 있을 경우는 두번째 방법으로만 적용하시면 되겠습니다.^^
답변이 도움이 되셨길 바랍니다.
감사합니다.
' nVal          : Change Event로 받아온 셀에 입력된 최종 값
' oVal : Selection Change Event로 받아온 최종 수정 전 입력된 값
' tVal : 삭제된 값이 원복된 것인지 확인하기 위한 임시 값
' DeleteFlag : 셀이 삭제 될 경우 발동되는 Trigger
Dim nVal As Variant: Dim oVal As Variant
Dim DeleteFlag As Boolean: Dim tVal As Variant

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

oVal = Target.Value

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Dim pvTbl As PivotTable

' 오류가 발생할 경우 EH로 넘어가면서 명령문이 바로 종료됩니다.
On Error GoTo EH:

nVal = Target.Value

' Target이 비어있을 경우 오류가 발생하면서 명령문 종료 (셀 완전 삭제시)
If nVal "" Then
' DeleteFlag (셀 삭제여부 Trigger) 가 False 이거나 빈칸일 경우 피벗테이블 업데이트를 진행합니다.
If DeleteFlag = False Or IsEmpty(DeleteFlag) Then
If oVal nVal Then
Application.EnableEvents = False
For Each pvTbl In Me.PivotTables
pvTbl.RefreshTable
Next
Application.EnableEvents = True
End If
Else
Select Case True
' DeleteFlag가 True이고 새로입력된값 = 임시값 이면 Pass
Case nVal = tVal
' DeleteFlag가 True이고 임시값 = 이전값일 경우 삭제된 값이 복원된 상태이므로
' 임시값을 새로운 값으로 치환하고 Pass
Case oVal = tVal
tVal = nVal
' 위 두가지 상황이 아닐 경우 새로 입력된경우이므로 피벗테이블 업데이트 후 DeleteFlag 를 False로 리턴
Case Else
Application.EnableEvents = False
For Each pvTbl In Me.PivotTables
pvTbl.RefreshTable
Next
Application.EnableEvents = True
DeleteFlag = False
End Select
End If
Else
If DeleteFlag = False Or IsEmpty(DeleteFlag) Then
DeleteFlag = True
tVal = oVal
Else
tVal = oVal
End If
End If

Exit Sub
EH:

End Sub
배우고싶다
배우고싶다 2020.04.23 14:42
가르쳐 주신대로 붙여봤는데.. 컴파일 오류가 뜨는데요... 왜그런걸까요? 죄송합니다. 한번더 설명해주시면 안될까요?
글래스
글래스 2020.04.23 15:48
모든 내용을 싹 지우고 위 내용을 넣으면 될까요? 계속 안되서요 ㅠㅠㅠ
오빠두엑셀
오빠두엑셀 작성자 2020.04.24 09:31
안녕하세요?^^
이전에 올려드린 코드에 문제가 있어서, 어제 저녁에 코드를 새로 수정하였습니다.
완성파일안에 시트를 2개로 나눠 다시 올려드렸으니 확인해보시겠어요?
#2 시트안의 명령문을 확인해보시면 될 듯 합니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.
화이트러쉬안
화이트러쉬안 2021.12.24 14:07
강의에서 사용한 명령문과 많이 다른 것 같은데..이걸 그대로 복붙하는게 맞나요?
오빠두엑셀
오빠두엑셀 작성자 2021.12.26 09:47
화이트러쉬안님 안녕하세요?
네 그대로 사용하셔도 좋습니다. 게시글 3번째 섹션 명령문을 복사/붙여넣기 후 테스트해보시거나, 완성파일을 참고해보세요.
뀨우
뀨우 2022.09.26 01:46
저는 이대로 했는데 전혀 반응이 없어요...ㅠㅠ
Jeba
Jeba 2020.04.24 02:20
Some one please translate me in English. English translation mode is not working in this page.
오빠두엑셀
오빠두엑셀 작성자 2020.04.24 15:41
Hi, Jeba :)
I recommend you to use Chrome and enable the auto-translation function(it's built-in) to see the english version of this page ! :)
Hopefully it helps.
Thanks
MACHO
MACHO 2020.04.26 01:35
완성파일에 #1시트 데이터를 기초로 다른 시트에서 업데이트 하기를 만들었을때, 자동 업데이트가 한번만 실행되고 난 후 다시는 자동업데이트가 안되는 에러가 있습니다. 다른 시트에서 업데이트 할때도 계속하여 동작이 되는 방법은 없을까요?
오빠두엑셀
오빠두엑셀 작성자 2020.04.26 23:44
안녕하세요?^^
예를 들어, [시트1] 에 원본데이터가 있고 [시트2]에 피벗테이블이 있을 경우,

시트1의 WorkSheet_Change 이벤트로 아래 명령문을 추가해보시겠어요?

Dim pvTbl As PivotTable

Application.EnableEvents = False
For Each pvTbl In WorkSheets("시트2").PivotTables
pvTbl.RefreshTable
Next
Application.EnableEvents = True


위 WorkSheets("시트2") 를 시트명에 맞춰 변경하시면 됩니다.^^
답변이 도움이 되셨길 바랍니다.
감사합니다.
박용준
박용준 2020.04.26 01:43
좋은 강의 정말 감사합니다.
질문이 있는데요...?
다은시트에 있는 피벗에 WorkSheet Activate 아닌 Change로 이벤트를 적용해도 실시간으로 적용이 되나요???
오빠두엑셀
오빠두엑셀 작성자 2020.04.26 23:45
안녕하세요?^^
아래 답변을 참고해보시겠어요?
https://www.oppadu.com/%ec%97%91%ec%85%80-%ed%94%bc%eb%b2%97%ed%85%8c%ec%9d%b4%eb%b8%94-%ec%9e%90%eb%8f%99-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8/#comment-2906
감사합니다.
엑셀배우자
엑셀배우자 2020.04.28 13:46
좋은 강의 감사합니다! 원하던 기능이었어요!
주난이
주난이 2020.05.09 09:45
"피벗테이블분석"메뉴는 엑셀버전에 따라 다르나요? ㅇ안보이는데?????
오빠두엑셀
오빠두엑셀 작성자 2020.05.09 19:09
안녕하세요?^^
엑셀 버전에 따라 화면구성이 다를 수 있습니다.
예를들어 엑셀 2010을 사용중이실 경우, 피벗테이블 선택 시, '옵션' 과 '디자인'으로 표시되는데요. 화면표시형식만 다를 뿐 사용방법은 동일합니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.
SEANPAUL
SEANPAUL 2020.05.09 10:02
몇번을 돌려봐도 감탄이 절로 나옵니다. 감사합니다.
콘투리맨
콘투리맨 2020.05.11 08:59
항상 너무 감사하게 잘보고있습니다 이번 강의랑은 번외적인 질문인데 피벗테이블 하면서 항상 너무 궁금했던내용이 값항목에 들어가는 내용이 20~30개가 넘어갈때 해당 카테고리별로 개수가 아닌 합계로 한번에 변경할 수 있는 방법이 있을까요..??ㅠㅠ
오빠두엑셀
오빠두엑셀 작성자 2020.05.12 04:46
안녕하세요?^^
엑셀은 기본적으로 '텍스트' 값은 필드합계로 '개수'를 구합니다. 해결책은 2가지인데요.
각 필드의 '빈칸'을 모두 숫자 '0'으로 변경하시면 필드요약이 합계로 출력됩니다.
또는 VBA를 이용하셔야 합니다.^^
답변이 도움이 되셨길 바랍니다.