엑셀 데이터 관리 핵심, UNPIVOT 함수 완벽 가이드 | M365 필수 기능
엑셀 데이터 관리가 어려운 이유, 바로 '피벗'에 있습니다! 오늘 소개해드리는 UNPIVOT 함수로 업무 생산성을 크게 높여보세요! 🚀
이 강의에서는 M365 버전의 LET, LAMBDA, TOCOL, EXPAND, HSTACK 함수를 조합해 사용자 정의 UNPIVOT 함수를 직접 제작하는 방법을 다룹니다. 피벗테이블 형식으로 작성된 보고서를 함수 한 번으로 올바른 데이터 구조로 피벗 해제하고, 완성된 공식을 이름관리자에 등록해 실무에서 재사용하는 과정까지 단계별로 정리합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
실습 가이드
라이브 강의 전체영상도 함께 확인해보세요!
위캔두 회원이 되시면 매주 오빠두엑셀에서 진행하는 라이브강의 풀영상을 확인하실 수 있습니다.
UNPIVOT 함수 마스터 공식 (M365)
완성된 마스터 공식을 이름관리자에 등록한 후, 실무에 바로 적용해보세요!😎 (LAMBDA 함수는 M365 버전에서만 제공됩니다.)
// 위 공식을 이름관리자에 등록한 후, 바로 사용할 수 있습니다.
// 공식 사용법은 UNPIVOT 함수 만들기 라이브 전체 영상을 참고해주세요!
UNPIVOT 함수 동작 원리 이해하기
실무에서 다양한 데이터를 엑셀로 분석하다 보면, 잘못된 데이터 구조 때문에 분석과 관리에 어려움을 겪는 경우가 많습니다. 특히 '피벗테이블' 구조로 작성된 데이터를 올바른 데이터 구조로 변환하고 정리하는 작업은 많은 직장인이 마주하는 큰 과제 중 하나입니다.

엑셀 2016 이후 버전에서 제공되는 파워쿼리를 활용하면, 복잡한 구조의 데이터를 올바른 구조로 편리하게 가공하고 작업 과정까지 자동화할 수 있습니다. 다만 M365 버전 사용자라면 엑셀의 기본 함수만으로도 피벗 해제 기능을 손쉽게 구현할 수 있습니다.
이번 강의에서는 M365 버전에 새롭게 추가된 기본 함수만으로 UNPIVOT 함수를 직접 제작하고 활용하는 방법을 단계별로 알아보겠습니다.
- UNPIVOT 함수는 보고서 형식으로 '피벗된' 데이터를 다시 '피벗 해제'할 때 사용합니다. 엑셀을 효율적으로 다루려면 데이터를 올바른 구조로 관리하는 것이 무엇보다 중요합니다. 실무에서 자주 발생하는 잘못된 데이터 구조와 이를 올바른 형식으로 정리해야 하는 이유는 이전 강의에서 자세히 정리해두었으니, 실습 전에 꼭 한 번 참고해보시길 권장드립니다.
- 먼저 피벗테이블 형식의 보고서를 피벗 해제하려면, 피벗된 보고서를 다음과 같이 3가지 영역(행, 열, 값)으로 분류해야 합니다.

- 예제파일의 [기초] 시트로 이동한 후, J3셀에 다음과 같이 TOCOL 함수를 사용한 수식을 입력하면 값 영역의 데이터가 1열의 세로 배열로 출력됩니다.
=TOCOL(C4:F9)

- EXPAND 함수를 활용하면 머리글 영역의 데이터를 피벗 해제할 수 있습니다. I3셀에 아래 수식을 입력하면 피벗 해제된 머리글 영역이 출력됩니다.
=TOCOL(IFERROR(EXPAND(C3:F3,ROWS(C4:F9)),C3:F3))
오빠두Tip : 위 공식의 단계별 동작 원리는 영상 강의에서 알기 쉽게 정리했습니다. 자세한 설명은 영상 강의를 참고해주세요!😊 - 이어서 아래 수식을 H3셀에 입력해 피벗 해제된 레이블 영역을 출력합니다.
=CHOOSEROWS(B4:B9,QUOTIENT(SEQUENCE(ROWS(J3#),,0,1),4)+1)

- H3, I3, J3셀에 수식을 모두 입력하면, 아래 그림과 같이 피벗 해제 데이터가 완성됩니다.

- 마지막으로 HSTACK 함수를 사용해 레이블, 머리글, 값 영역의 데이터를 하나의 배열로 병합합니다. L3셀에 아래 수식을 입력하면 피벗 해제된 각 범위가 하나로 병합되어 출력됩니다.
=HSTACK(H3#,I3#,J3#)
오빠두Tip : 엑셀 2021 이후 버전에서는 배열을 반환하는 수식의 시작셀 뒤에 # 기호를 추가해, 배열을 동적으로 선택할 수 있습니다. 분산 범위에 대한 자세한 설명은 아래 기초 입문 강의를 참고해보세요!👇
LET, LAMBDA 함수로 UNPIVOT 함수 만들기
LET 함수와 LAMBDA 함수를 활용하면 복잡한 공식의 처리 속도를 개선할 뿐만 아니라, 수식을 간결하게 정리하고 나만의 사용자 함수로 등록해 편리하게 재사용할 수 있습니다.
- LET 함수 작성하기 : LET 함수를 사용하면 복잡한 공식의 처리 속도를 개선하고, 수식을 간결하게 정리할 수 있습니다.
= LET ( 이름1, 값1, [이름2], [값2], ... , 수식 )
· 수식에 이름을 할당해 수식의 성능과 가독성을 함께 개선합니다. - 예제파일 [기초] 시트에서 L3셀에 작성된 수식을 지운 후, 다음과 같이 LET 함수를 작성합니다.
=LET(값,C4:F9,레이블,B4:B9,머리글,C3:F3,TOCOL(값))
// 값, 레이블, 머리글 이름으로 범위를 할당한 후, 피벗해제 된 값 범위(=TOCOL(값))을 출력합니다.
- 이전 단계에서 H3, I3, J3셀에 작성했던 각 공식을 참고해 LET 함수를 완성합니다.
=LET(값,C4:F10,
레이블,B4:B10,
머리글,C3:F3,
값필드,TOCOL(값),
머리글필드,TOCOL(IFNA(EXPAND(머리글,ROWS(값)),머리글)),
레이블필드,CHOOSEROWS(레이블,QUOTIENT(SEQUENCE(ROWS(값필드),,0),COLUMNS(머리글))+1),
HSTACK(레이블필드,머리글필드,값필드))
- LAMBDA 함수 작성하기 : LAMBDA 함수는 특정 공식을 편리하게 재사용할 수 있도록 사용자 함수를 생성하는 함수입니다.
=LAMBDA ( 인수1, [인수2], ..., 수식 )
· 엑셀의 기본 함수를 조합해 통합문서에서 재사용 가능한 사용자 정의 함수를 생성합니다. - 이제 기존의 LET 함수를 다음과 같이 LAMBDA 함수로 묶어 UNPIVOT 공식을 완성합니다.
=LAMBDA(값범위,레이블범위,머리글범위,LET(값,값범위,
레이블,레이블범위,
머리글,머리글범위,
값필드,TOCOL(값),
머리글필드,TOCOL(IFNA(EXPAND(머리글,ROWS(값)),머리글)),
레이블필드,CHOOSEROWS(레이블,QUOTIENT(SEQUENCE(ROWS(값필드),,0),COLUMNS(머리글))+1),
HSTACK(레이블필드,머리글필드,값필드)))
- LET 함수 동작 테스트 : 함수를 입력하면 아래 그림과 같이 #CALC! 오류가 출력됩니다. LAMBDA 함수는 엑셀의 일반 함수와 달리, 함수 뒤로 괄호 안에 인수를 추가로 작성해 동작을 직접 테스트할 수 있습니다.

- 다음과 같이 LAMBDA 함수 뒤에 인수를 추가해, 함수의 결과 값을 직접 확인할 수 있습니다.
=LAMBDA(값범위,레이블범위,머리글범위,LET(값,값범위,
레이블,레이블범위,
머리글,머리글범위,
값필드,TOCOL(값),
머리글필드,TOCOL(IFNA(EXPAND(머리글,ROWS(값)),머리글)),
레이블필드,CHOOSEROWS(레이블,QUOTIENT(SEQUENCE(ROWS(값필드),,0),COLUMNS(머리글))+1),
HSTACK(레이블필드,머리글필드,값필드)))(C4:F9,B4:B9,C3:F3)
- UNPIVOT 함수 등록하기 : LAMBDA 함수가 정상적으로 동작하는 것을 확인했다면, 이름 관리자에 UNPIVOT 함수를 등록합니다. [수식] - [이름 관리자]를 클릭해 이름관리자를 실행한 후, [새로 만들기] 버튼을 클릭합니다.

- 다음과 같이 이름, 설명, 참조 대상을 입력한 후, [확인] 버튼을 클릭해 UNPIVOT 함수를 등록합니다.
· 이름 : UNPIVOT
· 설명 : 피벗 보고서로 작성된 값, 레이블, 머리글 범위의 데이터를 피벗 해제 합니다.
· 참조 대상 : =LAMBDA(값범위,레이블범위,머리글범위,LET(값,값범위, 레이블,레이블범위, 머리글,머리글범위, 값필드,TOCOL(값), 머리글필드,TOCOL(IFNA(EXPAND(머리글,ROWS(값)),머리글)), 레이블필드,CHOOSEROWS(레이블,QUOTIENT(SEQUENCE(ROWS(값필드),,0),COLUMNS(머리글))+1), HSTACK(레이블필드,머리글필드,값필드)))
- 이제 통합문서에서 빈 셀을 선택한 후, 다음과 같이 UNPIVOT 함수로 피벗 보고서 형식의 데이터를 손쉽게 피벗 해제할 수 있습니다.
=UNPIVOT(C4:F9,B4:B9,C3:F3)

또 한번 놀랍니다.
그런데 값이 "0"인 것은 제외하고 unpivot도 가능한가요?
값이 0인 항목을 제외하는 작업은, 먼저 unpivot 함수로 세로 방향 데이터를 만든 후
filter 함수를 사용해서 0이 아닌 항목으로 필터를 걸어주면 될 것 같습니다.
LET 함수로 UNPIVOT 함수의 결과를 변수로 선언해서 수식을 작성해보세요. :)
https://www.oppadu.com/let-%ed%95%a8%ec%88%98-%ec%82%ac%ec%9a%a9%eb%b2%95/
한가지 궁금한 것이 있습니다~
그룹개수가 동일한 경우만 위 lambda함수를 사용할 수 있는 것이겠지요?
예제 파일의 두번째 시트(활용)를 보면 두번째 머리글이 모두 "메뉴", "가격"으로 2개씩이잖아요. 그래서 4번째 인수가 "2"인 것이고요.
그런데 만약 두번째 머리글이 동일한 개수가 아닌 경우는 사용할 수 없는 것인가요??
네 맞습니다, 이번 강의에서 소개해드린 UNPIVOT 함수는 그룹 개수를 사용할 경우 모든 그룹의 머리글 개수가 동일할 때에만 올바르게 동작합니다.
그룹별 머리글 개수가 다를 경우에는 옳지 않은 결과가 반환됩니다.
다음에 이 부분도 개선하여 함수를 업데이트해보겠습니다.^^
감사합니다.