[엑셀 지옥 탈출기 EP.01] 오후 4시, 5만 줄의 엑셀이 나를 비웃었다
[발단 — The Crisis]
오후 4시 7분. K의 슬랙에 알림이 떴다.
최 이사: K 씨, 지난 분기 영업 실적 데이터 있지? 내일 아침 9시 임원회의 때 쓸 건데, 대시보드로 깔끔하게 정리해서 보내줘. 엣지있게. 데이터는 공유 드라이브에 올려놨으니까.
K는 "넵"을 타이핑하고 엔터를 눌렀다. 아직 괜찮았다. 분기 데이터 정리쯤이야, 3년차 분석가가 못 할 리 없다.
공유 드라이브를 열었다.
파일명: 영업실적_최종_진짜최종_v3_수정본(2).xlsx
K의 손가락이 멈췄다.
5만 2,341행.
그것만으로는 문제가 아니었다. 문제는 '안'이었다.
A열부터 G열까지 셀 병합이 미친 듯이 걸려 있었다. 지역을 기준으로 묶어놓았는데, '서울'이라는 단어 하나가 아래로 47개 행을 집어삼키고 있었다. 날짜 열은 더 참혹했다. 2024-01-15, 1/15, 24.1.15, Jan 15, 2024 — 네 가지 형식이 하나의 열에 공존하고 있었다. 마치 4개국 유엔 회의처럼. 그 사이사이에 빈 행과 소계, 합계가 레고 블록처럼 끼어 있었다.
K의 동공이 흔들렸다.

남은 시간: 16시간 53분.
[전개 — The Struggle]
가장 먼저 한 것은, 역시 구글링이었다.
"엑셀 셀 병합 해제 자동" — 검색 결과: VBA 매크로를 쓰라는 블로그 포스트. 코드를 복사해 붙여넣었다. 매크로가 돌았다. 병합은 풀렸다. 하지만 병합되어 있던 '서울', '경기', '부산' 같은 지역명은 맨 윗 행에만 남아 있었다. 나머지 46개 행은 공백. 5만 행의 지역 열이 90% 공백인 엑셀. 상황이 나아진 건 한 톨도 없었다.
날짜 형식은 수작업밖에 없었다. DATEVALUE 함수를 걸었다. #VALUE! 에러가 3천 개. Jan 15, 2024 같은 영문 날짜는 한국어 로케일의 엑셀이 이해하지 못했다.
K는 CTRL+H로 치환을 시작했다. Jan을 1월로. Feb를 2월로. 하나씩. 하나씩.
시간이 스르르 녹았다.
오후 6시 42분. 치환 완료. 하지만 소계행은 아직 남아 있었다. =SUBTOTAL이 걸린 행을 찾아 하나씩 지우려니 어디가 데이터이고 어디가 집계인지 경계가 흐렸다. 잘못 지우면 끝이다.
K는 모니터를 물끄러미 바라봤다.
이렇게 하면 내일 아침 9시가 아니라 내일 저녁 9시에도 못 끝난다.
[절정 — The Epiphany & Action]
오후 7시 14분. 자판기 커피를 들고 자리에 앉았을 때, 머릿속에 한 줄이 스쳤다.
"엑셀 '안에서' 엑셀을 고치려고 하니까 미치는 거다."
K는 키보드 위에서 손을 멈추고, 한 번도 제대로 써본 적 없는 탭을 눌렀다.
[데이터] → [데이터 가져오기] → [파일에서] → [Excel 통합 문서에서]
Power Query 편집기가 열렸다.
회색 인터페이스. 왼쪽의 쿼리 목록. 오른쪽의 '적용된 단계'. K의 눈이 번뜩였다.
Power Query는 엑셀의 데이터를 직접 건드리지 않는다. 원본을 건드리지 않고, 변환 '레시피'를 단계별로 쌓아가는 구조. 잘못되면 단계를 삭제하면 그만이다. 되돌리기에 대한 공포가 사라지는 순간이었다.
K는 숨을 내쉬고, 첫 단추를 눌렀다.
1단계: 셀 병합의 저주 풀기
셀 병합이 풀리면서 생긴 null 행들 — Power Query에서는 이걸 한 방에 처리한다. [지역] 열에서 우클릭, [채우기] → [아래로]. K가 구글링과 VBA로 1시간 걸렸던 작업이 클릭 3번, 2초에 끝났다.
2단계: 날짜의 4개국 유엔 회의 종료
Power Query의 **[열 형식 변경] → [날짜]**를 선택했다. 2024-01-15는 그대로, 1/15은 자동 인식. 하지만 Jan 15, 2024에서 오류가 떴다. K는 침착하게 **[열 추가] → [사용자 지정 열]**을 열고, M 코드 한 줄을 입력했다:
Date.From(Text.Trim([날짜]))
로케일 무시 강제 변환. 나머지 24.1.15 같은 패턴은 **[값 바꾸기]**로 연도 접두사를 붙인 뒤 같은 함수를 태웠다. 전체 작업 시간: 4분.
3단계: 소계·합계 유령 퇴치
데이터행과 집계행을 구분하는 건 간단했다. [금액] 열에서 [필터] → null 또는 비정상 값 제거. =SUBTOTAL이 걸려 있던 행들은 Power Query가 값 자체를 불러올 때 이미 공식이 아닌 결과값으로 들어왔기 때문에, **[필터] → [비어 있지 않은 행만]**으로 깔끔하게 도려냈다.
4단계: 최종 구조 정리
열 순서 정리. 불필요한 메모 열 삭제. 데이터 유형 확정. 그리고 [닫기 및 로드].
오후 7시 38분.
5만 2,341행의 쓰레기 데이터가 48,617행의 완벽하게 구조화된 테이블로 돌아왔다. 올바른 날짜. 빈 칸 없는 지역명. 유령 소계행 제로.
K의 입에서 어이없는 웃음이 새어 나왔다.
"...이걸 이제 알았다고?"

[결말 — The Triumph]
K는 모니터를 한 번 더 바라봤다. Power Query 편집기 오른쪽의 [적용된 단계] 목록이 7개 쌓여 있었다. 이 7개 단계가 방금 K의 2시간짜리 노가다를 24분으로 줄였다.
그리고 이 레시피에는 한 가지 마법이 더 있었다.
다음 분기에 같은 형식의 엑셀이 들어오면? 파일 경로만 바꿔주면 같은 변환이 자동으로 적용된다. 셀 병합이 몇 개든, 날짜 형식이 몇 가지든, Power Query는 같은 레시피를 다시 돌릴 뿐이다.
K는 노가다에서 해방된 것이 아니었다. 앞으로 올 모든 노가다에서 해방된 것이다.
시계를 봤다. 오후 7시 40분.
데이터는 깨끗해졌다. 정제된 48,617행의 영업 실적이 엑셀 시트 위에 가지런히 누워 있었다.
하지만 K의 손에서 긴장이 풀리진 않았다.
최 이사가 원한 것은 '깨끗한 데이터'가 아니다. **"엣지있는 대시보드"**다. 이 숫자들을 최 이사가 '감동'할 그림으로 바꿔야 한다.
K는 노트북 옆에 세워둔 머그컵을 들어 올렸다. 커피는 이미 식어 있었다.
"...대시보드."
남은 시간: 13시간 20분.
K의 시선이 즐겨찾기에 박혀 있던 한 사이트로 향했다. Tableau Public — 며칠 전 무료로 풀렸다는 소식을 어디선가 봤었다.
K의 손가락이 다시 움직이기 시작했다.
📌 K가 24분 만에 5만 줄의 쓰레기 데이터를 완벽하게 세탁한 그 Power Query 레시피(M 코드 전문)와, 어떤 엑셀 파일이든 즉시 적용할 수 있는 '전처리 자동화 체크리스트'는 아래 구독자 전용 영역에서 바로 복사할 수 있습니다.