=IFERROR(B2/C2,0) 返回 B2/C2 的结果,结果出错时返回 0。第一个参数是你想要的公式;第二个参数是在该公式产生任何错误时改为显示的内容。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Product | Revenue | Units | Plain | With IFERROR |
| 2 | Pens | $120 | 80 | $1.50 | $1.50 |
| 3 | Paper | $300 | 50 | $6.00 | $6.00 |
| 4 | Ink | $90 | 0 | #DIV/0! | $0.00 |
| 5 | Tape | $45 | 30 | $1.50 | $1.50 |
| 6 | Clips | $0 | 0 | #DIV/0! | $0.00 |
Ink 和 Clips 的数量是 0,所以 D 列中的普通除法显示 #DIV/0!。E 列对它们显示 $0.00,其他每一行都显示正常的单价。在 C4 中输入 15,两列都会显示 Ink 的单价。
IFERROR 语法
=IFERROR(value, value_if_error)
value是要计算的公式。- 当
value是任何错误时,返回value_if_error:#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL!,以及 #CALC! 这类较新的错误。 - 如果
value不是错误,IFERROR 会原样返回它。
替换值可以是数字(0)、文本("Not found")、空文本("")或另一个公式,例如在另一张表中再查找一次:=IFERROR(VLOOKUP(E2,A2:C6,3,FALSE),VLOOKUP(E2,G2:I6,3,FALSE))。
IFERROR 搭配 VLOOKUP
值不在表格中时,查找公式会返回 #N/A。用 IFERROR 包住它,就能改为显示一条提示:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Look for | Price | |
| 2 | Apple | Fruit | $1.20 | Pear | $1.50 | |
| 3 | Pear | Fruit | $1.50 | Kiwi | Not found | |
| 4 | Carrot | Vegetable | $0.80 | Milk | $1.10 | |
| 5 | Bread | Bakery | $2.40 | |||
| 6 | Milk | Dairy | $1.10 |
Kiwi 不在列表中,所以 F3 显示 Not found。在 A4 中把 Carrot 改成 Kiwi,F3 就能找到它。如果用 XLOOKUP,就不需要 IFERROR 来做这件事,因为它的第四个参数就是“找不到”时的值:=XLOOKUP(E2,A2:A6,C2:C6,"Not found")。
IFNA:只捕获 #N/A
IFNA 的用法和 IFERROR 一样,但只替换 #N/A。对于查找来说,这通常正是你想要的:#N/A 表示“找不到”,这是正常的结果;而其他任何错误都说明公式本身写错了。在这个表格中,公式要求返回一张三列表格的第 4 列,这是个笔误:
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Look for | IFERROR | IFNA | |
| 2 | Apple | Fruit | 1.2 | Pear | Not found | #REF! | |
| 3 | Pear | Fruit | 1.5 | ||||
| 4 | Carrot | Vegetable | 0.8 | ||||
| 5 | Bread | Bakery | 2.4 | ||||
| 6 | Milk | Dairy | 1.1 |
Pear 明明在表格中,F2 却显示 Not found:IFERROR 把错误列号导致的 #REF! 变成了和找不到产品时一样的提示。G2 让 #REF! 显示出来,你就能看出公式坏了。把 G2 中的 4 改成 3,它会返回 1.5。IFNA 需要 Excel 2013 或更高版本。
出错时返回空白
如果什么都不想显示,就把空文本(两个双引号)作为替换值:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Month | Last year | This year | Growth |
| 2 | Jan | 200 | 240 | 20% |
| 3 | Feb | 0 | 150 | |
| 4 | Mar | 180 | 171 | -5% |
| 5 | Apr | 90 | ||
| 6 | May | 250 | 300 | 20% |
2 月和 4 月去年没有销售额,所以无法计算增长率,单元格保持空白。其他月份显示 20%、负 5% 和 20%。内容为 "" 的单元格里是文本:SUM 和 AVERAGE 会跳过它,但 =D3*2 会得到 #VALUE!。如果后面的公式要对这一列做算术运算,就改为返回 0。
练习:带备用值的查找
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Product | Stock | Look for | Stock | ||
| 2 | Apple | 40 | Kiwi | |||
| 3 | Pear | 25 | ||||
| 4 | Carrot | 60 | ||||
| 5 | Bread | 12 | ||||
| 6 | Milk | 30 |
轮到你了: 在 F2 中,从 A2:B6 里查找 E2 中产品的库存;产品不在列表中时,显示 "Not found"。
为什么掩盖所有错误可能会藏住问题
IFERROR 并不能修复任何东西,它只决定单元格显示什么。在用它包住公式之前:
- 先弄清楚为什么会出错。 如果是 Units 单元格为空导致了 #DIV/0!,真正的解决办法可能是让人把数据填上,而不是显示一个为零的单价。
- 查找时优先使用 IFNA,这样错误的列号(#REF!)、拼错的名称(#NAME?)或数字列中的文本(#VALUE!)仍然会显示出来。
- 做除法时只检查特定的情况。
=IF(C2=0,0,B2/C2)只处理除数为零的情况;如果 B2 中的引用错了,仍然会显示对应的错误。#DIV/0! 错误一文比较了这两种做法。 - 选一个不会被误认为数据的替换值。 价格列中的 0 看起来像真实的价格,还会拉低平均值;
""或 "Not found" 则不会。
最后再包上 IFERROR:等公式在本该正常计算的行上给出正确结果之后。
常见问题
怎样把 IFERROR 和 VLOOKUP 一起使用?
把查找公式包起来:=IFERROR(VLOOKUP(E2,A2:C6,3,FALSE),"Not found")。当 E2 不在第一列中时,单元格显示 Not found 而不是 #N/A。=IFNA(VLOOKUP(E2,A2:C6,3,FALSE),"Not found") 效果相同,而且仍会显示其他错误。
怎样让 IFERROR 返回空白单元格?
把空文本作为第二个参数:=IFERROR(B2/C2,"")。单元格看起来是空的,但里面是文本,所以对它使用 =D2+1 会得到 #VALUE!;SUM 和 AVERAGE 会跳过它。
IFERROR 和 IFNA 有什么区别?
IFERROR 会替换所有错误:#N/A、#DIV/0!、#VALUE!、#REF!、#NAME?、#NUM! 和 #NULL!。IFNA 只替换 #N/A,也就是查找时的“找不到”,其他错误照常显示,这样公式写错了也不会被掩盖。
怎样在 Excel 中把 #N/A 替换成 0?
用 IFNA 包住公式,把 0 作为替换值:=IFNA(VLOOKUP(E2,A2:C6,3,FALSE),0)。XLOOKUP 的第四个参数本身就是替换值:=XLOOKUP(E2,A2:A6,C2:C6,0)。
哪些 Excel 版本有 IFERROR 和 IFNA?
IFERROR 从 Excel 2007 开始提供,IFNA 从 Excel 2013 开始提供。在旧文件中你可能会看到 =IF(ISERROR(B2/C2),0,B2/C2),它的作用和 IFERROR 相同,但会把公式计算两次。