2020.04.23 : 셀의 내용을 삭제한 경우도 횟수에 상관없이 이전 단계로 돌아가기 가능한 전체 명령문을 업데이트 하였습니다. 자세한 내용은 3번째 항목을 확인해주세요.
2020.04.23 추가 : 댓글로 문의주신 분이 많아, 완성파일 시트를 두개로 분리하였습니다. 완성파일을 다운받으시면 2개의 시트가 있습니다. [완성예제#1] 시트에는 데이터 추가/삭제시 모두 실시간으로 업데이트되는 명령문이 입력되어 있습니다. 따라서, 데이터 삭제 후 이전단계로 돌아가기가 불가능하다는 단점이 있습니다. [완성예제#2] 시트는 '데이터 추가' 시에만 실시간으로 업데이트 됩니다. 데이터 삭제후에는 횟수에 상관없이 이전단계로 돌아갈 수가 있습니다.
강의 설명
실무자가 엑셀에서 가장 많이 사용하는 기능 중 하나, 바로 '피벗테이블' 입니다. 피벗테이블은 엑셀에서 아주 훌륭한 도구이지만, 원본데이터 업데이트가 실시간으로 안 되는 문제가 있는데요. 그러다보니 주기적으로 데이터가 추가되는 자료에서, 매번 '새로고침' 작업을 해줘야 하는 번거로움이 있었습니다.
피벗테이블은 '새로고침'이 되어야만 자료가 업데이트 됩니다.
피벗테이블 자동 업데이트를 쉽게 구현할 수 있는 방법, 어디 없을까요?
간단한 명령문 복사/붙여넣기로 피벗테이블 자동 업데이트를 구현할 수 있습니다.
이번 강의에서는 명령문 복사/붙여넣기만으로 할 수 있는 각 상황별 피벗테이블 자동 업데이트 방법을 3단계로 나눠서 자세히 알아봅니다.
매크로를 사용하여 피벗테이블 자동 업데이트를 구현할 경우 한가지 문제점이 있습니다. 바로 매크로가 동작된 시점부터 '이전 단계로 돌아가기' 작업이 모두 초기화 된다는 점인데요.
이는 새로운 자료를 추가할 때는 별 문제되지 않지만, 자료를 잘못 삭제하여 이전단계로 돌아가야 할 경우에는 큰 문제가 될 수 있습니다.
이 문제는 명령문을 약간만 변형하면 쉽게 해결할 수 있습니다. 아래 코드를 복사하여 각 명령문에 붙여넣기하면, 데이터가 삭제되어도 이전 단계로 돌아갈 수가 있게 됩니다. (아래 명령문은 통채로 복사해서 시트모듈에 그대로 붙여넣기 합니다.)
단, 이전단계로 돌아가기 시 돌아가는 순서는 삭제된 순서와 동일해야 합니다. 즉, 이전단계로 돌아가는 도중 키보드나 마우스로 다른 셀을 클릭하거나 이동하게 되면 이전단계로 돌아가기 기록이 초기화되는 것에 주의합니다.
' nVal : Change Event로 받아온 셀에 입력된 최종 값' oVal : Selection Change Event로 받아온 최종 수정 전 입력된 값' tVal : 삭제된 값이 원복된 것인지 확인하기 위한 임시 값' DeleteFlag : 셀이 삭제 될 경우 발동되는 TriggerDim nVal As Variant: Dim oVal As Variant
Dim DeleteFlag AsBoolean: Dim tVal As Variant
PrivateSub Worksheet_SelectionChange(ByVal Target As Range)
oVal = Target.ValueEndSubPrivateSub Worksheet_Change(ByVal Target As Range)Dim pvTbl As PivotTable
' 오류가 발생할 경우 EH로 넘어가면서 명령문이 바로 종료됩니다.OnErrorGoTo EH:
nVal = Target.Value' Target이 비어있을 경우 오류가 발생하면서 명령문 종료 (셀 완전 삭제시)If nVal <>""Then' DeleteFlag (셀 삭제여부 Trigger) 가 False 이거나 빈칸일 경우 피벗테이블 업데이트를 진행합니다.If DeleteFlag =FalseOrIsEmpty(DeleteFlag)ThenIf oVal <> nVal Then
Application.EnableEvents=FalseForEach pvTbl InMe.PivotTables
pvTbl.RefreshTableNext
Application.EnableEvents=TrueEndIfElseSelectCaseTrue' DeleteFlag가 True이고 새로입력된값 = 임시값 이면 PassCase nVal = tVal
' DeleteFlag가 True이고 임시값 = 이전값일 경우 삭제된 값이 복원된 상태이므로' 임시값을 새로운 값으로 치환하고 PassCase oVal = tVal
tVal = nVal
' 위 두가지 상황이 아닐 경우 새로 입력된경우이므로 피벗테이블 업데이트 후 DeleteFlag 를 False로 리턴CaseElse
Application.EnableEvents=FalseForEach pvTbl InMe.PivotTables
pvTbl.RefreshTableNext
Application.EnableEvents=True
DeleteFlag =FalseEndSelectEndIfElseIf DeleteFlag =FalseOrIsEmpty(DeleteFlag)Then
DeleteFlag =True
tVal = oVal
Else
tVal = oVal
EndIfEndIfExitSub
EH:
EndSub
단, 위의 명령문을 사용할 경우 주의사항이 있습니다.
'셀을 완전히 삭제' 하는 작업(=우클릭하여 삭제 또는 단축키 Ctrl + - 키)은 횟수에 상관없이 이전단계로 돌아가기가 가능합니다.
셀을 완전히 삭제하는 작업은 횟수에 상관없이 이전단계로 돌아가기가 가능합니다.
하지만, '셀 안의 내용만 지우는 작업'(=← 또는 Delete 키)은 한번만 이전단계로 돌아가기가 가능하다는 점을 주의해야 합니다. 그 이유는, 셀의 내용만 지운 작업을 이전단계로 돌아가기 할 경우, 셀의 내용이 '입력' 되면서 매크로가 실행됩니다. 따라서 피벗테이블 자동 업데이트 매크로가 돌게되고, 이전의 모든 작업이 초기화됩니다.