上一篇我们让公式里的引用学会“该跟着走时跟着走”,这篇让它学会“看情况给答案”。

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!。这些错误的意思是“公式坏了”,改成空白等于把报警灯拆了。所以兜底的原则是:只兜那种你预期会发生、而且换成默认值也不影响结论的错误(比如本月还没数据导致除零);公式结构性的错误,让它露出来。

写完检查三件事

  1. 条件里的引用,往下拖之后是不是还盯着正确的格子;
  2. 各档边界上下各挑一行试一下,特别是贴着边界的那一对;
  3. 有没有处理“数据还没填”的情况,会不会把 FALSE 或 0 直接暴露给看表的人。

这三条过了,一个 IF 列就可以放心拖满整张表。