XLOOKUP을 쓰다 갑자기 #SPILL! 오류가 뜨면 당황스럽습니다. 분명히 어제까지 잘 되던 수식인데, 셀 하나 옮겼더니 갑자기 오류라니. 이 글에서는 #SPILL! 오류가 왜 생기는지, 그리고 상황별로 어떻게 해결하는지를 구체적으로 정리했습니다. Excel 365 이후 도입된 동적 배열(Dynamic Array) 기능을 이해하면 오류 해결이 훨씬 쉬워집니다.
1. #SPILL! 오류가 뭔지 먼저 알아야 합니다
#SPILL! 오류는 Excel 365(2019년 이후)에서 동적 배열 기능이 도입되면서 처음 등장한 오류입니다. 이전 버전의 Excel에서는 아예 존재하지 않았습니다.
동적 배열(Dynamic Array)이란?
기존 Excel에서 수식은 하나의 셀에 하나의 결과만 반환했습니다. 하지만 Excel 365부터는 수식이 여러 결과를 자동으로 인접 셀에 퍼뜨리는(Spill) 방식으로 바뀌었습니다.
예를 들어 =SEQUENCE(5)를 하나의 셀에 입력하면 1, 2, 3, 4, 5가 아래 5칸에 자동으로 채워집니다. 이게 스필(Spill) 동작입니다.
XLOOKUP, FILTER, SEQUENCE, UNIQUE 같은 함수들이 모두 이 동적 배열 함수에 해당합니다.
💡 핵심 개념 정리
스필 범위(Spill Range): 수식이 결과를 채우려는 인접 셀 영역
#SPILL! 오류: 그 스필 범위에 뭔가 문제가 생겨서 결과를 못 채울 때 발생
결론적으로 “결과를 쏟아내려 했는데 막혀있다”는 신호입니다.

2. 오류 원인 파악하는 방법, 딱 하나입니다
본격적인 해결법보다 원인 파악 방법을 먼저 알아야 합니다. 원인마다 해결책이 다르거든요.
노란 ⚠️ 아이콘이 답을 알고 있습니다
#SPILL! 오류가 뜬 셀을 클릭하면 왼쪽에 노란 경고 아이콘이 나타납니다. 이걸 클릭하면 드롭다운이 펼쳐지고, 첫 번째 줄 회색 텍스트에 정확한 원인이 적혀 있습니다.
⚠️ 아이콘 클릭 시 나타나는 메시지 예시:
• Spill range is not blank → 범위 안에 뭔가 있음
• Spill range in table → Excel 표(Table) 안에 있음
• Spill range has merged cell → 병합 셀이 방해하고 있음
• Spill range extends beyond worksheet's edge → 시트 경계 초과
• Spill range is unknown → 가변 함수 문제
• Out of memory → 메모리 부족 또는 너무 큰 배열
그리고 같은 드롭다운에서 “Select Obstructing Cells” 를 선택하면, 문제가 되는 셀로 바로 이동합니다. 어디가 막혀있는지 눈으로 확인하기 훨씬 편합니다.
3. 원인별 해결 방법 총정리

원인 ① 스필 범위에 데이터가 있을 때
가장 흔한 케이스입니다. 수식 결과가 채워져야 할 셀에 이미 다른 데이터가 있는 경우입니다.
해결 방법:
– 수식 셀 클릭 → 파란 점선으로 스필 범위 확인
– 해당 범위 안의 데이터 삭제 또는 다른 곳으로 이동
– 또는 수식 자체를 비어있는 공간으로 이동
Ctrl + End로 실제 사용 범위를 확인하거나, 해당 셀을 Delete 키로 완전히 지워보세요.원인 ② Excel 표(Table) 안에서 XLOOKUP 쓸 때 — 가장 헷갈리는 케이스
Excel에서 구조적 참조(Structured Reference)로 만든 표(Table) 안에 동적 배열 수식을 넣으면 #SPILL!이 발생합니다.
이유가 뭐냐면, Excel 표는 이미 자체적으로 동적으로 확장됩니다. 여기에 또 다른 동적 배열 수식을 넣으면 Excel이 두 가지 확장 방식을 동시에 처리하지 못하고 충돌합니다.
해결 방법 1: @ 연산자 추가 (가장 간단)
❌ 오류: =XLOOKUP([Account], AccountsMapping[Account Name], AccountsMapping[Mapping]) ✅ 해결: =XLOOKUP([@Account], AccountsMapping[Account Name], AccountsMapping[Mapping])
@(암묵적 교차 연산자, Implicit Intersection Operator)를 lookup_value 앞에 붙이면, Excel이 열 전체가 아닌 현재 행의 값만 참조합니다. 스필 없이 단일 값을 반환하게 됩니다.
해결 방법 2: 표를 일반 범위로 변환
표(Table)를 일반 셀 범위로 바꾸면 동적 배열이 정상적으로 작동합니다.
테이블 디자인(Table Design) → 도구(Tools) → 범위로 변환(Convert to Range)
단, 이렇게 하면 표의 자동 확장, 구조적 참조, Power Query 연결 같은 기능을 잃게 됩니다. 표 기능이 꼭 필요하다면 @ 연산자 방법을 먼저 시도하세요.
해결 방법 3: 수식을 표 외부 열로 이동
표 옆 빈 열에 수식을 넣고, 표 데이터와 병렬로 관리하는 방식입니다. 깔끔하진 않지만 동작은 합니다.
원인 ③ 병합 셀(Merged Cell)이 방해할 때
스필 범위 안에 병합된 셀이 하나라도 있으면 오류가 발생합니다. 동적 배열은 병합 셀에 값을 쓸 수 없기 때문입니다.
해결 방법:
1. 문제 셀로 이동: 오류 아이콘 → “Select Obstructing Cells” 클릭
2. 홈(Home) → 병합하고 가운데 맞춤(Merge & Center) → 셀 병합 취소(Unmerge Cells)
3. 또는 수식을 병합 셀이 없는 위치로 이동
원인 ④ 시트 경계를 벗어날 때
수식 결과가 너무 많아서 시트 끝(행 1,048,576 또는 열 XFD)을 넘어가려 할 때 발생합니다.
대표적인 패턴이 =XLOOKUP(A:A, ...) 처럼 전체 열을 lookup_value로 지정하는 경우입니다.
❌ =XLOOKUP(A:A, B:B, C:C) ← 100만 행 처리 시도 → 경계 초과 ✅ =XLOOKUP(A2:A1000, B2:B1000, C2:C1000) ← 명시적 범위 지정
Excel 365에서는 동적 배열 특성상 A:A 참조가 실제로 약 1,048,576개의 결과를 반환하려 시도합니다. 셀 하나에서 시작하면 금방 시트 끝에 닿습니다.
해결 방법:
– lookup_value를 A2:A100처럼 실제 데이터 범위만 지정
– 또는 수식 셀을 위쪽/왼쪽으로 이동하여 결과가 들어갈 공간 확보
원인 ⑤ RAND, RANDARRAY 같은 가변 함수와 함께 쓸 때
RAND(), RANDARRAY(), RANDBETWEEN() 같은 함수는 계산할 때마다 값이 바뀝니다. XLOOKUP의 반환 배열 크기가 매 계산마다 달라지면 Excel이 스필 범위 크기를 확정하지 못해 오류가 납니다.
해결 방법:
– 랜덤 값을 별도 셀에 계산한 뒤 고정값으로 붙여넣기(Paste as Values)
– 또는 XLOOKUP의 검색 기준에서 가변 함수 제거
원인 ⑥ 메모리 부족
매우 큰 배열을 반환하려 할 때 발생합니다. 실무에서는 주로 전체 열 참조(A:A)와 함께 나타납니다. 원인 ④와 겹치는 경우가 많으니 범위를 줄이는 것이 우선입니다.
4. 실무에서 자주 만나는 패턴 3가지
패턴 A: 필터링된 목록에서 XLOOKUP 쓸 때
=XLOOKUP(D2, A:A, B:B)
A:A 전체를 참조하면서 D2 하나를 찾으려 해도, Excel은 100만 행을 전부 뒤집니다. 아래처럼 바꾸세요:
=XLOOKUP(D2, A2:A500, B2:B500)
패턴 B: IFERROR와 함께 쓸 때
❌ =IFERROR(XLOOKUP([ID], Table1[ID], Table1[Name]), "없음")
✅ =IFERROR(XLOOKUP([@ID], Table1[ID], Table1[Name]), "없음")
IFERROR로 감싸더라도 안쪽 XLOOKUP의 @ 문제는 해결되지 않습니다. lookup_value 앞에 @ 를 붙여야 합니다.
패턴 C: 다중 열 반환 시
=XLOOKUP(A2, Sheet2!A:A, Sheet2!B:D)
반환 범위가 3열이면 오른쪽으로 3칸이 필요합니다. 그 범위 안에 뭔가 있으면 SPILL이 납니다. 결과가 들어갈 공간을 미리 비워두세요.
5. XLOOKUP 외 다른 함수에서도 같은 방식으로 해결됩니다
#SPILL! 오류는 XLOOKUP만의 문제가 아닙니다. 동적 배열을 반환하는 모든 함수에서 동일하게 적용됩니다.
| 함수 | 주요 SPILL 원인 | 빠른 해결책 |
|---|---|---|
| XLOOKUP | 테이블 내부 / 전체 열 참조 | @ 연산자 또는 범위 명시 |
| VLOOKUP | lookup_value에 A:A 사용 | A2:A100으로 변경 |
| FILTER | 결과 공간 부족 | 아래 셀 비우기 |
| UNIQUE | 결과 공간 부족 | 아래 셀 비우기 |
| SEQUENCE | 시트 경계 초과 | 작은 숫자로 변경 |
| SORT / SORTBY | 결과 공간 부족 | 공간 확보 또는 위치 변경 |
6. 자주 묻는 질문 (FAQ)
Excel 2019나 2016에서도 SPILL 오류가 나나요?
동적 배열은 Microsoft 365 구독판 Excel(2018년 9월 이후)에서만 지원됩니다. Excel 2019 영구 라이선스, 2016, 2013에서는 동적 배열 자체가 없어서 #SPILL! 오류도 발생하지 않습니다. 대신 이 함수들 자체가 아예 작동하지 않을 수 있습니다.
자신의 Excel 버전 확인: 파일(File) → 계정(Account) → Excel 정보 에서 버전 번호 확인
점선 테두리 안이 비어 보이는데 왜 SPILL이 나나요?
겉으로는 비어 보여도 스페이스 문자나 빈 문자열("")이 들어있을 수 있습니다. 의심되는 셀에서 Delete 키를 눌러 완전히 지워보세요. Ctrl+H로 ” “(공백) → (빈값) 치환도 효과적입니다.
@ 연산자가 뭔가요? 수식 앞에 붙이면 다른 문제가 생기진 않나요?
@(암묵적 교차 연산자)는 여러 값 중 현재 행/열과 교차하는 단일 값만 반환하도록 지시합니다. 테이블 구조적 참조([Column])에서 사용하면, 전체 열이 아닌 현재 행의 값 하나만 참조합니다. 기존 VLOOKUP이 했던 것과 같은 동작입니다. 의도하지 않은 스필을 막는 안전한 방법입니다.
공식 Microsoft 문서: 암묵적 교차 연산자 @ 설명
7. 참고 자료 및 공식 문서
- Microsoft 공식: #SPILL! 오류 수정 방법
- Microsoft: 시트 경계 초과 SPILL 오류
- Ablebits: Excel #SPILL! 오류 완전 가이드
- Excelbuddy: XLOOKUP SPILL 오류 수정법
- Chandoo.org: 표 안의 SPILL 오류 3가지 해결법

테이블 안에서 XLOOKUP을 쓴다면
[@컬럼명]으로, 전체 열을 참조한다면 범위를 명시적으로. 이 두 가지가 SPILL 오류의 80%를 해결합니다.