Menu

Excel #SPILL! 错误:原因和解决方法

#SPILL! 表示一个返回多个值的公式没有地方放结果:它的溢出区域中有单元格不是空的。清空挡路的单元格,结果就会出现。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

#SPILL! 表示公式返回了多个值(一个列表或一张表),但 Excel 没有地方写入它们:结果需要的区域中至少有一个单元格不是空的。下面的 =UNIQUE(A2:A6) 需要 C2 到 C4 三个单元格,而 C4 中有一个 x。删掉 C4,列表就会出现。

被一个值挡住的 UNIQUE
C2
ABC
1ProductUnique list
2Apple#SPILL!
3Pear
4Applex
5Plum
6Pear
#SPILL! 结果需要的单元格超过了空闲的单元格。请清空挡路的单元格。

点击 C2:表格下方的说明会告诉你哪里出了问题。然后点击 C4,按 Delete 键。三种产品会溢出到 C2:C4,并有一个边框标出溢出区域。在 C3 中随便输入点什么,错误又会出现。Excel 中也是这样:FILTER、UNIQUE、SORT、SEQUENCE 和 TEXTSPLIT 这类返回数组的函数,只有在整个溢出区域都空着时才能正常工作。它们需要 Excel 2021 或更高版本(TEXTSPLIT 需要 Microsoft 365 或 Excel 2024);更早的版本对它们显示 #NAME?,所以那里从不会出现 #SPILL!(函数本身的用法见 UNIQUE)。

怎样解决 #SPILL! 错误

  1. 点击显示 #SPILL! 的单元格。在 Excel 中,一个虚线边框会标出结果想要填充的区域。
  2. 点击单元格旁边的警告图标,选择 选择障碍单元格。Excel 会选中所有挡路的单元格。
  3. 按 Delete 键,或者把这些单元格移到别处(剪切后粘贴)。

如果挡路的单元格里有你需要的数据,就移动公式:把它放到下方和旁边都是空单元格的列或行中。

单元格看起来是空的却出现 #SPILL!

最让人困惑的情况:溢出区域看起来是空的,Excel 却仍然显示 #SPILL!。只有一个空格的单元格,或者返回空字符串 "" 的公式,都不算空,它们和普通的值一样会挡住溢出。

看起来是空的却会挡路的单元格
A2
ABC
1NumbersNumbers
2#SPILL!#SPILL!
3
4
#SPILL! 结果需要的单元格超过了空闲的单元格。请清空挡路的单元格。

A2 需要 A2:A4,而 A4 中有一个空格。C2 需要 C2:C3,而 C3 中有 =""。点击 A4 或 C3 看看里面有什么,删掉它,数字就会溢出。在 Excel 中,即使单元格里什么都看不到,选择障碍单元格 也能找到它们。白色填充上的白色文字也会以同样的方式藏起来。

一个公式溢出到另一个公式上

两个会溢出的公式可能互相挡住,也可能有人在下方输入的公式正好落在上面那个公式的溢出区域里。

互相挡路的两个公式
D2
ABCDE
1NameDeptITSales
2AnaIT#SPILL!Ben
3BenSalesDee
4CyIT5
5DeeSales
6EveIT
#SPILL! 结果需要的单元格超过了空闲的单元格。请清空挡路的单元格。

IT 列表需要 D2:D4 三个单元格,而 D4 中有一个 COUNTA 公式。E2 中的 Sales 列表有它需要的两个单元格,所以能正常显示。把 COUNTA 公式移到 D6(或列表下方的任意单元格),IT 的姓名就会溢出。要给列表留出增长的空间:如果以后加入第四位 IT 员工,结果就需要多一个单元格。

VLOOKUP 和整列引用导致的 #SPILL!

为旧版 Excel 写的公式里,一个常见原因是查找值用了整列:

=VLOOKUP(A:A,Prices!A:B,2,FALSE)      #SPILL!  (one result for every row of the sheet)
=VLOOKUP(A2,Prices!A:B,2,FALSE)       one result, fill it down
=VLOOKUP(A2:A100,Prices!A:B,2,FALSE)  100 results that spill
=VLOOKUP(@A:A,Prices!A:B,2,FALSE)     one result, the value on the formula's own row

A:A 有 1,048,576 个单元格,所以第一个公式要返回 1,048,576 个结果,而从第 2 行往下已经没有足够的行了:警告菜单会提示溢出区域超出了工作表的边缘。这种写法来自旧版 Excel,它会悄悄地只使用公式所在行的值。Excel 365 在旧工作簿中把公式显示为 =VLOOKUP(@A:A,...),以保留这种行为,但新输入同样的公式就会溢出整列。=A:A*2 以及其他对整列做运算的公式也是如此。改用单个单元格再向下填充、使用实际大小的区域,或者加上 @。查找本身的更多内容见 VLOOKUP 页面。

每行一个结果,而不是溢出

对区域做运算的公式也会溢出。这通常正是你想要的,但有时你更需要每行一个公式。

一个溢出公式与每行一个公式
C2
ABCD
1MonthSalesSpilled +10%Filled +10%
2Jan100110110
3Feb120132132
4Mar909999
5Apr140154154
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

两列都显示 110、132、99 和 154。C2 中只有一个公式,C3:C5 是它溢出的结果:点击 C3,表格下方的说明会告诉你它是从 C2 溢出的。在 C4 中输入内容,C2 就会变成 #SPILL!。D2:D5 是四个独立的公式,所以每个单元格都可以单独修改,也不会被挡住。如果别人会直接改写单个结果,就用第二种写法。

表格中、合并单元格或大小未知导致的 #SPILL!

这些原因取决于工作簿,而不是公式:

  • 在 Excel 表格中(“插入 > 表格”):表格不支持溢出结果,所以表格列中的 FILTER 或 UNIQUE 会显示 #SPILL!。把公式放到表格外,或者选中表格,选择 表设计 > 转换为区域。
  • 溢出区域中有 合并单元格:选中它们,选择 开始 > 合并后居中 > 取消单元格合并,或者移动公式。
  • 溢出区域未知:每次重新计算时结果的大小都会变化,比如 =SEQUENCE(RANDBETWEEN(1,10))。Excel 拒绝溢出大小不固定的结果。给它一个固定的大小。
  • 溢出区域过大 或 超出工作表边缘:结果会超过最后一行或最后一列。内存不足:数组太大,无法计算。这三种情况都要缩小区域,通常是把整列引用换成实际数据所在的范围。

只返回一个值,就不会被挡住

如果你只需要列表中的一个数字,比如一共有多少种不同的产品,就把会溢出的函数放进只返回一个值的函数中。单个值从不溢出,所以没有单元格能挡住它。

有多少种不同的产品
E2
ABCDE
1ProductDifferent products
2Apple
3Pear
4Applex
5Plum
6Pear
7Apple
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: E2 应该显示 A2:A7 中有多少种不同的产品。直接写 =UNIQUE(A2:A7) 会溢出到 E4 中的 x 上。在 E2 中写一个返回数量的公式。

COUNTA 统计 UNIQUE 返回的值,只返回一个数字。同样的思路也适用于 =INDEX(SORT(A2:A7),1)(取排序后列表的第一个值)、=INDEX(FILTER(...),1)(取第一个匹配项)或 =SUM(FILTER(...))(求总和)。

常见问题

Excel 中的 #SPILL! 是什么意思?

公式返回了不止一个值(动态数组),但 Excel 无法把它们写入下方或旁边的单元格,因为其中至少有一个单元格不是空的、是合并单元格,或者位于表格中。清空或移走挡路的内容,结果就会出现。

单元格看起来是空的,为什么还会出现 #SPILL!?

看起来是空的单元格里,仍可能有一个空格、一个返回 "" 的公式,或者设置成白色的文本。它们都会挡住溢出。点击错误旁边的警告图标,选择 选择障碍单元格,然后按 Delete 键。

VLOOKUP 出现 #SPILL! 怎么解决?

查找值是整列或一个区域,比如 =VLOOKUP(A:A,D:E,2,FALSE),于是 Excel 尝试为工作表的每一行返回一个结果。改用单个单元格再向下填充,即 =VLOOKUP(A2,D:E,2,FALSE),或者使用实际大小的区域,即 =VLOOKUP(A2:A100,D:E,2,FALSE)。

Excel 中怎样让公式不溢出?

让它只返回一个值。在区域前加 @,只取公式所在行的值(=@A2:A10*2),或者把结果放进只返回一个值的函数,比如 =COUNTA(UNIQUE(A2:A10)) 或 =INDEX(SORT(A2:A10),1)。

溢出公式可以放在 Excel 表格中吗?

不可以。会溢出的公式在表格中显示 #SPILL!。把它放到表格外的单元格中,或者用 表设计 > 转换为区域 把表格转换为普通区域。

Coddy 编程语言插图

和 Coddy 一起学编程

开始