上一篇我们让公式里的引用学会“该跟着走时跟着走”,这篇让它学会“看情况给答案”。
IF 只做一件事:算一个真假,再挑一个结果
看一个最常用的写法:
=IF(B2>=60,"及格","不及格")
B2>=60 是一段能算出真或假的表达式,结果只有 TRUE 或 FALSE 两种。IF 拿到这个结果后负责挑:真,返回第二个参数;假,返回第三个参数 1。结构就是:
IF(条件, 成立时返回什么, 不成立时返回什么)
第二个参数必填,第三个可以省略。
两个容易踩的写作规则:
- 想让结果是一段文字,要用双引号包起来:
"及格"。不包的话 Excel 会把它当成一个名字去找,找不到就报#NAME?。 - 想让结果是数字或另一个单元格,就别加引号。
"100"是文本,B2="100"对数字 100 永远不成立,于是整列都走“不成立”那一支——不报错,但结果一眼看去就是不对。
条件里的引用照样遵守上一篇的规则。往下拖时 B2>=60 变成 B3>=60,正是你要的;如果及格线写在别的固定格子里,就得像汇率那样写成 B2>=$F$1,把那一格钉死。
屏幕上出现 FALSE 或 0,多半是第三个参数没写全
省略第三个参数有两种写法,结果并不一样 2:
| 写法 | 条件不成立时显示 |
|---|---|
=IF(B2>=60,"及格") | FALSE |
=IF(B2>=60,"及格",) | 0 |
前一种是逗号干脆不写,Excel 就把逻辑值 FALSE 本身当结果扔出来;后一种是逗号写了、内容留空,Excel 把空参数当 0 2。两种都不是你想看到的,而且都不报错。
所以,整列里零星冒出 FALSE 或 0,第一件事就是去看公式尾部。
想要“不成立时什么都不显示”,正确写法是主动给一个空文本:=IF(B2>=60,"及格","")。两个连续的双引号表示空文本,单元格看起来是空的,但里面确实有一个公式。
多档条件:把“剩下的情况”再问一次
只分及格、不及格,IF 就够了。要是分数要分四档呢?
思路是把第三个参数换成下一个 IF:第一个条件不成立时,说明最高那一档已经被排除,于是接着问下一档。
=IF(B2>=90,"优",IF(B2>=80,"良",IF(B2>=60,"及格","不及格")))
读起来是这样:
- 先问:≥90 吗?成立就返回“优”,结束。
- 不成立,说明已经隐含“小于 90”,那就只问
B2>=80。你不必写成“≥80 且 <90”,因为上一层已经替你排除了 ≥90 的情况。每层只写一个边界,这就是嵌套 IF 能写得短的原因。 - 再问:≥60 吗?成立就“及格”。
- 都不成立,落到最里面的“不及格”。它不是又一个条件,而是最后剩下的那种可能。
括号怎么配平?数一数开了几个 IF,就在末尾补几个 )。上面开了三个 IF,末尾就是三个右括号。可以按 IF(条件,结果, 的节奏一路往前推,最后统一收尾;也可以每写完一层先补上右括号再回来填下一层,这样不容易漏。Excel 最多允许嵌套 64 层 7,日常分档远远用不到,所以真正要防的是括号和顺序写乱,不是层数。
顺序错了不报错,只是悄悄给出错的答案
IF 是 碰到第一个成立的条件就停下来,后面的条件根本不会被看到。所以条件必须从一端排到另一端,中间不能来回横跳。
微软文档里举过这个坑:有个公式想按销售额分档给提成,但比较顺序被写成了从 5000 一路往上到 15000。一行销售额 12,500 的数据,在“大于 5000”这一档就成立了,公式返回 10% 就收工,后面几档压根没被问到 3。
这类错误特别难看穿:它只在部分行出错,也不报任何错。所以写完以后别只看第一行。把每档边界值的上下各挑一行出来试——比如准备好 90、89、80、79 四行,看它们各自落在哪一档。贴着边界的那一对最容易暴露顺序问题。
括号太多,可以换成 IFS
同样是分档,IFS 把“条件、结果”成对排开,不用一层层往里嵌 4:
=IFS(B2>=90,"优",B2>=80,"良",B2>=60,"及格",TRUE,"不及格")
读法是:从上往下找第一对成立的条件,返回它对应的结果,后面的不再看。末尾的 TRUE 永远成立,所以它就是兜底那一档。
两点提醒:如果所有条件都不成立、又没写兜底,IFS 会返回 #N/A 4,所以最后那对 TRUE, … 不能省;IFS 需要 Excel 2019 及以上或 Microsoft 365 4,老版本继续用嵌套 IF,逻辑完全一样,只是括号多一些。
兜底一:还没填数据的行,别当成 0
判断最容易出的乌龙和空单元格有关。Excel 里,空白单元格参与数值比较时会被当成 0:它同时被认为等于空文本、也等于 0,但空文本并不等于 0 5。
后果很直接:明细表里还没填分数的行,B2>=60 实际算的是 0>=60,为假,被标成“不及格”。整列看着很正常,只是凭空多了几条假的不及格。
正确做法是在最前面先问一句有没有数据,再进入分档:
=IF(B2="","",IF(B2>=60,"及格","不及格"))
B2="" 问的就是“这一格是不是空的”。空就直接给空文本,后面的比较根本不会执行。
另外,“看着空”的格子不一定真空:里面可能是一个空格(B2="" 不成立),也可能是某个公式返回的空文本(B2="" 成立,但 ISBLANK(B2) 返回 FALSE)。日常检查用 B2="" 一般够用,因为这两种“没内容”它都能命中。
兜底二:公式根本算不出来时返回什么
有些错误不是判断结果不理想,而是公式压根算不出来,比如分母为 0 的 #DIV/0!、查不到内容的 #N/A。IFERROR 专门处理这种情况 6:
=IFERROR(原来的公式, 出错时显示什么)
它包住整段公式:公式正常就原样返回结果,出现错误就换成你指定的值。常见写法 =IFERROR(A2/B2, ""),除数还没填的行就不会满屏 #DIV/0!。要包在你希望保护的整段公式外面,而不是只包住其中一小块。
但 IFERROR 会把所有错误一起吞掉,包括本该让你看见的那些:函数名拼错的 #NAME?、引用的整列被删掉的 #REF!。这些错误的意思是“公式坏了”,改成空白等于把报警灯拆了。所以兜底的原则是:只兜那种你预期会发生、而且换成默认值也不影响结论的错误(比如本月还没数据导致除零);公式结构性的错误,让它露出来。
写完检查三件事
- 条件里的引用,往下拖之后是不是还盯着正确的格子;
- 各档边界上下各挑一行试一下,特别是贴着边界的那一对;
- 有没有处理“数据还没填”的情况,会不会把
FALSE或 0 直接暴露给看表的人。
这三条过了,一个 IF 列就可以放心拖满整张表。