If you’ve upgraded to Microsoft 365 and suddenly your XLOOKUP formulas are throwing a #SPILL! error where nothing used to fail — you’re not alone. This is one of the most common sources of confusion for anyone transitioning to dynamic array formulas. This guide breaks down every cause and gives you a clear fix for each one.
1. What Is the #SPILL! Error — and Why Does It Exist?
The #SPILL! error is exclusive to Excel 365 and Excel 2021+. It simply doesn’t exist in older versions like 2016 or 2019 (perpetual license), because those versions don’t support dynamic arrays at all.
The shift to Dynamic Arrays
Before dynamic arrays, every Excel formula returned exactly one result into one cell. Starting with Excel 365 in late 2018, functions can now return multiple results that automatically “spill” into adjacent cells — no Ctrl+Shift+Enter required.
Functions like XLOOKUP, FILTER, UNIQUE, and SEQUENCE are all built around this behavior. Type =SEQUENCE(5) into a single cell and Excel automatically fills the next five rows with 1 through 5.
💡 Quick Concept Check
Spill Range: The block of adjacent cells a formula wants to populate with results
#SPILL! Error: Something in that spill range is preventing the formula from writing its results
Think of it as: “I have results ready to go — but the landing zone is blocked.”

2. Before Anything Else: Read the Error Message
This step alone will save you a lot of guesswork. Every #SPILL! error has a specific cause, and Excel tells you what it is — if you know where to look.
The yellow ⚠️ icon is your first stop
Click the cell showing the error. A small yellow warning diamond appears to the left. Click it, and a dropdown opens. The first line in gray is the root cause.
Error messages you might see:
• Spill range is not blank → Something’s in the way
• Spill range in table → You’re inside an Excel Table
• Spill range has merged cell → A merged cell is blocking it
• Spill range extends beyond worksheet's edge → Too many results for the sheet
• Spill range is unknown → A volatile function is causing instability
• Out of memory → The array is too large
From the same dropdown, you can click “Select Obstructing Cells” to jump directly to whatever is blocking the spill. No manual hunting required.
3. Fixes for Every Cause

Cause ① Something is blocking the spill range
The most common scenario. Another value — or even an invisible space character — is sitting in a cell where Excel wants to write a result.
Fix:
– Click the formula cell to reveal the blue dashed spill range border
– Delete or move anything inside that range
– Or relocate the formula to a completely empty area
""). Hit Delete on those cells (not Backspace), or run Find & Replace to swap spaces for nothing.Cause ② The formula is inside an Excel Table — the trickiest one
This is the scenario that catches most people off guard. If you’re using XLOOKUP inside a formatted Excel Table (Insert → Table), you’ll hit #SPILL! almost every time.
Here’s why: Excel Tables are already dynamic — they auto-expand as you add rows. Putting a dynamic array formula inside a structure that also wants to expand creates a conflict Excel can’t resolve.
Fix 1: Add the @ operator (fastest)
❌ =XLOOKUP([Account], AccountsMapping[Account Name], AccountsMapping[Mapping]) ✅ =XLOOKUP([@Account], AccountsMapping[Account Name], AccountsMapping[Mapping])
The @ (implicit intersection operator) restricts the lookup_value to the current row only — exactly what you want. No spilling, no conflict.
Fix 2: Convert the Table to a plain range
Table Design → Tools → Convert to Range
This removes the Table formatting entirely, which lets dynamic arrays work normally. The trade-off: you lose structured references, auto-expansion, and Power Query integration. Try Fix 1 first.
Fix 3: Move the formula outside the Table
Place it in an adjacent column outside the Table boundary. Less elegant, but it works.
Cause ③ A merged cell is in the way
Merged cells and dynamic arrays are fundamentally incompatible. Excel can’t write results into a merged cell.
Fix:
1. Use “Select Obstructing Cells” from the error dropdown to jump to the problem cell
2. Go to Home → Merge & Center dropdown → Unmerge Cells
3. Or move the formula somewhere with no merged cells nearby
Cause ④ The result set runs off the edge of the sheet
This happens when the formula would produce more rows (or columns) than the sheet has room for. The classic trigger: using a whole-column reference like A:A as the lookup_value.
❌ =XLOOKUP(A:A, B:B, C:C) ← Excel attempts to process 1,048,576 rows ✅ =XLOOKUP(A2:A500, B2:B500, C2:C500) ← Explicit, bounded range
In Excel 365, referencing A:A isn’t just “the column” — it’s literally all 1,048,576 rows. A formula starting at row 2 runs out of sheet before it can finish.
Fix:
– Replace whole-column references with explicit ranges like A2:A1000
– Or move the formula cell higher up so results have room to spill downward
Cause ⑤ Volatile functions like RAND or RANDARRAY
RAND(), RANDARRAY(), and RANDBETWEEN() recalculate on every single worksheet change. If the array size returned by XLOOKUP fluctuates between calculation passes, Excel can’t lock down the spill range and throws an error.
Fix:
– Calculate the random values separately, then paste as static values (Paste Special → Values)
– Restructure the formula to remove the volatile function from the lookup criterion
Cause ⑥ Out of memory
Usually appears alongside Cause ④. When a formula tries to return an enormous array, Excel runs out of memory to hold the results. Reducing the range size is the fix here too.
4. Three Real-World Patterns You’ll Run Into
Pattern A: Whole-column reference in a lookup
=XLOOKUP(D2, A:A, B:B)
Even though you only want one result for D2, Excel processes all million rows in A:A. Change it to:
=XLOOKUP(D2, A2:A500, B2:B500)
Pattern B: XLOOKUP wrapped in IFERROR
❌ =IFERROR(XLOOKUP([ID], Table1[ID], Table1[Name]), "Not found")
✅ =IFERROR(XLOOKUP([@ID], Table1[ID], Table1[Name]), "Not found")
Wrapping in IFERROR doesn’t fix the inner XLOOKUP’s table conflict. The @ needs to go on the lookup_value itself.
Pattern C: XLOOKUP returning multiple columns
=XLOOKUP(A2, Sheet2!A:A, Sheet2!B:D)
Returning 3 columns means Excel needs 3 cells to the right. If anything sits in those cells, you’ll get #SPILL!. Clear the expected output area before entering the formula.
5. The Same Fixes Apply to Other Dynamic Array Functions
#SPILL! isn’t an XLOOKUP-only problem. Any function that returns multiple results can trigger it.
| Function | Common SPILL Trigger | Quick Fix |
|---|---|---|
| XLOOKUP | Table reference / whole column | Add @ or use explicit range |
| VLOOKUP | lookup_value set to A:A | Change to A2:A100 |
| FILTER | Not enough empty rows below | Clear space below the formula |
| UNIQUE | Not enough empty rows below | Clear space below the formula |
| SEQUENCE | Result runs off sheet edge | Use smaller number |
| SORT / SORTBY | Not enough empty space | Move or clear destination area |
6. FAQ
Does #SPILL! happen in Excel 2019 or 2016?
No. Dynamic arrays — and therefore #SPILL! — only exist in Microsoft 365 (subscription) starting from September 2018. Excel 2019, 2016, and 2013 perpetual licenses don’t support this behavior. Those versions also don’t have XLOOKUP at all.
To check your version: File → Account → About Excel
The spill range looks empty — why is it still throwing the error?
A cell can contain a space character or an empty string ("") and appear completely blank. Press Delete (not Backspace) on those cells to fully clear them. You can also use Find & Replace (Ctrl+H) to replace a single space with nothing.
What exactly does the @ operator do — is it safe to use?
The @ (implicit intersection operator) tells Excel to return only the single value that intersects with the current row or column, rather than the full array. Inside a Table, [@Column] and [Column] look similar but behave very differently. Using @ is safe and is exactly how structured references are supposed to work in row-by-row calculations.
Official Microsoft docs: Implicit intersection operator: @
7. References & Further Reading
- Microsoft Support: How to correct a #SPILL! error
- Microsoft Support: #SPILL! — extends beyond worksheet’s edge
- Ablebits: Complete guide to Excel #SPILL! errors
- Excelbuddy: How to fix XLOOKUP #SPILL! error
- Chandoo.org: Fix SPILL errors in Excel Tables — 3 solutions

Inside a Table? Add
@ before the lookup_value. Using A:A? Switch to an explicit range. Those two changes cover the vast majority of XLOOKUP #SPILL! errors you’ll encounter.