用 IFERROR 包装你的查找公式
报表里出现一片 #N/A,打印出来难看,发给别人还显得不专业。IFERROR 就是给公式包一层"出错时的退路"。
一、基本用法
=IFERROR(原公式, 出错时返回的值)
两个参数:第一个是要执行的公式,第二个是出任何错误时返回的结果。
=IFERROR(VLOOKUP(A2,$E:$G,3,0),"未匹配")
查不到就显示 "未匹配",而不是 #N/A。
二、它到底能兜住哪些错
IFERROR 捕获所有七种错误:#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL!。
这既是优点也是缺点——它会把"真正的公式错误"一起藏起来。比如你把区域写成了不存在的列,#REF! 被吞掉,你以为是"没数据"。
所以原则是:明确知道会遇到哪种错,就用 IFNA 只兜那一种。
=IFNA(VLOOKUP(A2,$E:$G,3,0),"未匹配")
IFNA 只捕获 #N/A,其他错误照常暴露。查表场景下这是更专业的选择。
三、除法里的 #DIV/0!
算占比时除数为 0 是常态:
=IFERROR(B2/C2,0)
更精确的写法是先判断:
=IF(C2=0,0,B2/C2)
两者的差别:前者会掩盖 C2 是文本导致的 #VALUE!,后者不会。数据源可靠时用 IFERROR 更短,数据源杂就用 IF。
四、返回值怎么选
这是比公式更容易被忽略的部分。三种常见选择:
| 返回值 | 适合场景 | 隐患 |
|---|---|---|
"" | 中间过程列 | 参与后续运算会变 0,且难和"真空白"区分 |
0 | 确实代表"零"的数值 | 会被 SUM/AVERAGE 计入,拉低平均值 |
"未匹配" | 需要人眼检查的列 | 混进文本,求和会报错 |
做数值汇总列时别用 "":空字符串参与求和虽然结果是 0,但用 COUNT 会漏数,用 AVERAGE 分母会不对,排查起来极其费时。
推荐做法:错误提示和计算列分开。计算列返回 0 或保留 #N/A,另起一列标状态。
=IF(ISNA(MATCH(A2,$E:$E,0)),"缺单价","")
五、别套两层
写出来像这样的公式,说明结构该重构了:
=IFERROR(IFERROR(VLOOKUP(A2,$E:$G,3,0),VLOOKUP(A2,$H:$J,3,0)),"")
两个来源都不在,说明数据源本身有问题。与其叠 IFERROR,不如先把两个来源合并成一张对照表。
六、性能注意
IFERROR 本身开销很小,但它包住的公式会被完整计算。如果一个 VLOOKUP 有十万行,加不加 IFERROR 耗时几乎一样——慢的是查找本身。
所以优化方向是缩小查找区域、改用 XLOOKUP、或者直接上 Power Query,而不是在 IFERROR 上做文章。
七、条件格式和筛选里的坑
IFERROR 返回 "" 的单元格,看起来是空的,但:
ISBLANK判定为FALSE(它不是真空);- 条件格式"空值"规则不会命中;
- 筛选时会出现一个"空白"选项,但它其实是空字符串。
需要后续准确识别空值时,用 =IFERROR(...,NA()) 保留 #N/A,再让条件格式针对 #N/A 上色。
八、速查
| 需求 | 写法 |
|---|---|
| 全部错误兜底 | =IFERROR(公式,"-") |
| 只兜查不到 | =IFNA(VLOOKUP(...),"未匹配") |
| 除零 | =IF(C2=0,0,B2/C2) |
| 标记数据缺失 | 另起状态列,不在数值列塞文本 |
IFERROR 是急救包,不是创可贴。用它是为了让表更好读,不是为了让错误消失——看不见的错误,才是最贵的错误。