Excel 公式实练:8 道「看着对其实错」的题

八道题,全部围绕「看起来正确、其实不对」的公式。每组先讲清一整族 bug 背后的那个原因,然后给你公式和场景——先自己推出结果,再看答案。

多数 Excel 页面在讲某个函数是干什么的。这种内容看一次就够,而且 Google 通常直接在搜索结果里就把它显示给你了,你根本不用点进来。真正让人耗掉几小时、又没法用一段摘要交付的,是另一件事:一个能跑、能返回数字、但结果是错的公式

本页练的就是这个。表格里的大部分 bug 出自四个原因——VLOOKUP 漏写第四参数导致精确匹配变成近似匹配、拖动时引用跟着滑动、错误值被读错、以及条件静默地匹配不到任何东西。每一个都很好修,但没撞见过的人几乎不可能发现。

本页内容在 Microsoft 365、Excel 2021 及较新版本中的行为一致;凡是需要更新版本的函数(比如 XLOOKUP)解析里都会写明。每题先自己推一遍再看答案,并留意每条解析推荐的那个习惯。

四个原因,八道题

值明明在,VLOOKUP 为什么还是 #N/A

3 道题

几乎所有 #N/A 都出自四个原因:第四个参数没写(于是 Excel 在未排序数据上做近似匹配)、查找值是文本而表里是数字(或反过来)、有尾随空格、或者查找列不是区域的最左列。按这个顺序排查——漏写第四参数最常见,而且它产生的是错误的答案而不是报错,因此最危险。

通常怎么表现「VLOOKUP 不好使」·「我明明看得到那个值,它还是返回 #N/A」

第 1 题

A 列的产品编号是文本(从 CSV 导入的),而你在公式里直接把编号当数字输入。会怎样?

=VLOOKUP(1024, A2:C50, 3, FALSE)

(A2 里是文本值 "1024")
  1. A返回 C 列的值——Excel 会自动转换
  2. B返回 #N/A,因为数字 1024 与文本 "1024" 永远匹配不上
  3. C返回 #VALUE!
  4. D返回 0
看答案与解析

正确答案B. 返回 #N/A,因为数字 1024 与文本 "1024" 永远匹配不上

🐱 Excel 在查找中不做类型转换:数字 1024 和文本 "1024" 是两个不同的键,匹配失败,于是 #N/A。识别特征是:屏幕上两个值长得一模一样,但文本靠左对齐、数字靠右对齐。修法要么转换整列(分列,或 =VALUE(A2)),要么在公式里对齐类型:VLOOKUP("1024", …)VLOOKUP(TEXT(1024,"0"), …)

第 2 题

查找没报错,但有好几行返回了错误的价格。编号列没有排序。最可能的原因是什么?

=VLOOKUP(A2, Products!A:D, 4)
  1. A区域应该写成绝对引用
  2. B漏写第四个参数,Excel 因此做近似匹配,返回的是不大于目标值的最近一个
  3. CD 列里是文本
  4. D不允许引用整列
看答案与解析

正确答案B. 漏写第四个参数,Excel 因此做近似匹配,返回的是不大于目标值的最近一个

🐱 省略第四个参数等于写了 TRUE——近似匹配——它假定查找列已升序排序。在未排序数据上它会静默地返回碰到的那个值,所以这个 bug 产生的是看起来很合理的错数而不是报错。除非你是有意做分档查找(比如税率区间),否则一律写 FALSE(或 0)。这是 Excel 里代价最高的一个习惯。

第 3 题

你想用 C 列的编号去查、返回 A 列的名称。这个公式返回什么?

=VLOOKUP(F2, A2:D100, 1, FALSE)

(F2 是编号;编号在 C 列;名称在 A 列)
  1. AA 列的名称
  2. B#N/A,因为 VLOOKUP 只在区域的最左列查找——这里是 A 列而不是 C 列
  3. C#REF!
  4. D编号本身
看答案与解析

正确答案B. #N/A,因为 VLOOKUP 只在区域的最左列查找——这里是 A 列而不是 C 列

🐱 VLOOKUP 永远在你给它的区域的第一列里查找,而且只能返回右侧的值。区域从 A 开始,于是它拿编号去名称列里找,什么也找不到。两个标准修法:INDEX(A2:A100, MATCH(F2, C2:C100, 0)),它没有左右限制;或者用 XLOOKUP(F2, C2:C100, A2:A100)——需要 Microsoft 365 或 Excel 2021 及以上。

美元符号:为什么一拖公式就崩

1 道题

不带美元符号的引用会随公式复制而移动。查找值需要这种移动(每行查自己的值),查找表则绝对不能动。几乎所有「第 2 行对、到第 20 行就错」的报告都是这一个 bug:表格区域跟着填充柄一起往下滑,直到它需要的那些行滑出了范围。

通常怎么表现「第一行是对的,往下拖就错了」·「$A$1 是什么意思?」

第 4 题

你在 B2 输入这个公式并往下拖到 B100。靠上的行是对的,靠下的行返回 #N/A。为什么?

=VLOOKUP(A2, Rates!A2:B50, 2, FALSE)
  1. A下面那些查找值确实不存在
  2. B表格区域是相对引用,拖到第 100 行时它已滑成 Rates!A100:B148,不再覆盖数据
  3. CVLOOKUP 不能拖动填充
  4. D工作表名需要加引号
看答案与解析

正确答案B. 表格区域是相对引用,拖到第 100 行时它已滑成 Rates!A100:B148,不再覆盖数据

🐱 拖动会把每个相对引用按相同行数平移:Rates!A2:B50 变成 A3:B51、再变成 A4:B52……一旦这个窗口滑过了你需要的那些行,匹配就消失了。用 Rates!$A$2:$B$50 把表锁住——更好的做法是把区域转成 Excel 表格并按名称引用,它根本不会滑动。编辑引用时按 F4 可以循环切换锁定方式。

看懂错误值,而不是靠猜

2 道题

每个错误值都自报原因,把常见的四个记住,排查就从猜测变成查表。#N/A 表示「没找到」——公式运行正常,只是值不在。#REF! 表示引用已不存在,通常是行列被删了,或者列序号指到了区域之外。#VALUE! 表示类型不对——本该是数字的位置出现了文本。#DIV/0! 就是字面意思。只有在你知道自己盖住的是哪一个之后,才可以用 IFERROR 包起来。

通常怎么表现「#REF! 是什么意思?」·「#VALUE!、#N/A、#DIV/0! 有什么区别」

第 5 题

区域宽四列(A 到 D)。这个公式返回什么?

=VLOOKUP(F2, A2:D100, 5, FALSE)
  1. A#N/A
  2. B#REF!,因为列序号 5 超出了四列宽的区域
  3. C#VALUE!
  4. DE 列的值
看答案与解析

正确答案B. #REF!,因为列序号 5 超出了四列宽的区域

🐱 列序号是在你给定的区域内计数的,不是在整张表里计数——所以 5 对 A:D 越界,Excel 返回 #REF!。这个区别在插入列时尤其要紧:序号不会自动更新,于是原本读第 3 列的公式会静默地开始读另一列数据。这正是推荐 INDEX/MATCH 或 XLOOKUP 的理由——它们直接引用返回列,插入列也不会错位。

第 6 题

同事把每个查找都用 IFERROR 包起来,让表格看着干净。风险是什么?

=IFERROR(VLOOKUP(A2, Rates!$A$2:$B$50, 2, FALSE), "")
  1. A没有风险——这是最佳实践
  2. B它把 #REF! 和 #VALUE! 也一并藏了,于是真正坏掉的公式看起来就像「这个值本来就没有」
  3. CIFERROR 会明显拖慢工作簿
  4. DIFERROR 只能配合 VLOOKUP 使用
看答案与解析

正确答案B. 它把 #REF! 和 #VALUE! 也一并藏了,于是真正坏掉的公式看起来就像「这个值本来就没有」

🐱 IFERROR 会吞掉所有错误类型,不只是你心里想的那一个。于是一个空单元格既可能是「这个编号还没有对应费率」,也可能是「有人删了一列、这个公式已经坏了」——而你分不出是哪种。只想处理「没找到」时改用 IFNA,把结构性错误留在明面上,好让它们被修掉而不是被糊住。

SUMIF、COUNTIF,以及那些静默失效的条件

1 道题

条件聚合是静默失败的:匹配不到任何东西的条件返回 0,而 0 看起来像个真答案。两个习惯能防住大部分问题——比较运算符要写在引号里(">100" 而不是 >100),并且记住 SUMIF 是先区域后求和区域,而 SUMIFS 是先求和区域。参数顺序搞反,正是「公式看着没错却返回 0」最常见的原因。

通常怎么表现「我的 SUMIF 为什么返回 0?」·「SUMIF 和 SUMIFS 有什么区别」

第 7 题

两个公式都想统计大于 100 的销售额之和。哪个是对的?

=SUMIF(B2:B50, ">100", C2:C50)

=SUMIFS(B2:B50, ">100", C2:C50)
  1. A两个都对
  2. B第一个——SUMIF 是(区域, 条件, 求和区域);SUMIFS 是(求和区域, 条件区域, 条件),所以第二个参数顺序错了
  3. C第二个——SUMIFS 永远更好
  4. D都不对;运算符必须写在引号外面
看答案与解析

正确答案B. 第一个——SUMIF 是(区域, 条件, 求和区域);SUMIFS 是(求和区域, 条件区域, 条件),所以第二个参数顺序错了

🐱 这两个函数的参数顺序确实相反,这属于设计上的疙瘩,只能背不能推:SUMIF 是(区域, 条件, [求和区域]),SUMIFS 是(求和区域, 条件区域1, 条件1, …)。上面那行 SUMIFS 在该给条件区域的位置传了一个条件字符串,因此会报错或返回无意义结果。一个可行的策略是一律用 SUMIFS(它处理单条件毫无问题),这样只需要记一种顺序。

继续练

Excel 公式 — 常见问题

值明明看得见,VLOOKUP 为什么返回 #N/A?

按可能性排序:漏写第四个参数(于是 Excel 做了近似匹配)、查找值是数字而表里存的是文本(或反过来)、有尾随空格、或者查找列不是区域的最左列。类型不匹配最阴——两个值长得一模一样,但文本靠左对齐、数字靠右对齐。

该用 VLOOKUP、INDEX/MATCH 还是 XLOOKUP?

有 Microsoft 365 或 Excel 2021 及以上就用 XLOOKUP:默认精确匹配、可向任意方向查找、插入列也不会错位。老版本用 INDEX/MATCH,好处相同。简单稳定的表用 VLOOKUP 也没问题——只要第四个参数永远写 FALSE。

#N/A、#REF!、#VALUE! 有什么区别?

#N/A 表示公式正常运行但没找到值。#REF! 表示引用已不存在——列被删了,或者列序号指到区域之外。#VALUE! 表示类型不对,通常是本该放数字的位置出现了文本。每个都自报原因,所以读错误值比猜快得多。

为什么第一行是对的、往下就错了?

几乎总是相对引用的问题:查找表跟着填充柄一起往下滑了。用美元符号锁住($A$2:$B$50),或者更好的做法——把区域转成 Excel 表格并按名称引用,它根本不会滑动。

把所有公式都用 IFERROR 包起来,是坏习惯吗?

它会把结构性错误和「值缺失」一起藏掉,于是坏掉的公式看起来就像一个空结果。只想处理「没找到」时用 IFNA,把 #REF! 和 #VALUE! 留在明面上,好让它们被修掉。