IF 家族:IF、IFS 与多层嵌套
一、IF 的三段式结构

=IF(条件,条件成立时的值,条件不成立时的值) 是 Excel 里最常用的函数,没有之一。三个参数缺一不可:第一个是能判断出真假的表达式,第二个是成立时的返回值,第三个是不成立时的返回值。写成 =IF(C2>=60,"及格","不及格") 就是最标准的用法。
第三个参数可以省略,但省略时条件不成立会返回 FALSE,而不是空白。很多人以为省略能少写一个参数,结果表格里出现一堆 FALSE,就是这个原因。想要不成立时显示空白,必须显式写成 =IF(C2>=60,"及格",""),两个英文双引号之间什么都不放。
返回值可以是数字、文本、另一个公式,也可以是另一个区域引用。写成 =IF(C2>=60,C2*0.1,0) 会直接参与后续求和,这是 IF 与后续计算衔接的关键。返回文本时记得加引号,返回数字时不加,这是新手最容易写错的地方。
条件参数本质上是一个真假值。写 =IF(C2>=60,...) 与写 =IF(TRUE,...) 在结构上是等价的,所以任何能返回 TRUE 或 FALSE 的表达式都可以放进去,包括比较运算、IS 系列函数、甚至另一个 IF。理解这一点,就能理解为什么 IF 可以嵌套。
还有一个细节:IF 会只计算被选中的那个分支。写 =IF(A2=0,0,1/A2) 时,A2 为 0 会返回 0 而不会报除零错误,因为 1 除以 A2 那条分支根本不会被计算。这个惰性求值特性可以用来规避很多错误,比在外面套 IFERROR 更精确。
还有一个高频用法是 IF 返回另一个区域的值。例如根据币种列决定取哪一列汇率,写成 =IF(B2="美元",VLOOKUP(A2,美元表,2,0),VLOOKUP(A2,人民币表,2,0))。IF 在这里起到分流作用,两个分支各自查找自己的表。这类写法在做多币种、多口径的报表时很常见,结构清晰,也容易扩展成三四个分支。
另外,IF 的第二第三参数都可以是数组,这在 Excel 365 里能实现整列判断后一次性返回结果。例如 =IF(C2:C200>=60,C2:C200,0) 会返回一整列结果,配合 SUM 就能直接算及格人员的合计。老版本里这需要按 Ctrl 加 Shift 加 Enter 确认,或者干脆加辅助列逐行计算。
二、嵌套 IF:能写几层,什么时候该停手

在一个 IF 的第三参数里再放一个 IF,就形成了嵌套。成绩分级是典型场景:=IF(C2>=90,"优秀",IF(C2>=80,"良好",IF(C2>=60,"及格","不及格")))。判断顺序是从高到低,一旦命中就停止,所以区间的排列顺序非常重要。
写嵌套时有两条铁律。第一,区间必须连续且不重叠,上面的例子如果写成先判断 60 再判断 90,那么 95 分会被判成及格,因为 95 已经满足了大于等于 60。第二,判断顺序要么从大到小,要么从小到大,不要穿插,否则自己三天后也读不懂。
Excel 允许嵌套 64 层 IF,但超过三层就应该停下来想一想有没有更好的写法。层数越多,公式越难读,出错概率也越高。实践中超过四层,几乎总能找到更清晰的替代方案,比如查表法或者 IFS。
查表法是替代深层嵌套的最佳方案。建一张两列的对照表,第一列是区间下限,第二列是等级名称,然后用 =VLOOKUP(C2,对照表,2,1) 一次搞定,第五参数写 1 表示近似匹配。新增一个等级时只改对照表,不用动公式。关于 VLOOKUP 的细节见 VLOOKUP 与 HLOOKUP:老牌查找。
| 写法 | 示例 | 优点 | 缺点 |
|---|---|---|---|
| 单层 IF | =IF(C2>=60,"及格","不及格") |
最简单直观 | 只能分两类 |
| 三层嵌套 | =IF(C2>=90,"优秀",IF(C2>=80,"良好","及格")) |
无需额外表格 | 层级多后难读 |
| IFS | =IFS(C2>=90,"优秀",C2>=80,"良好",TRUE,"及格") |
结构扁平清晰 | 2019 以上版本才有 |
| 查表法 | =VLOOKUP(C2,对照表,2,1) |
等级可随时增减 | 需要维护对照表 |
| 布尔相加 | =(C2>=90)*1+(C2>=80)*1 |
适合算分 | 不适合返回文本 |
判断顺序还有一个实用的检验方法:拿边界值逐个试。接上面的例子,分别用 59、60、79、80、89、90 六个数字去试,看结果是否正好落在预期档位。边界值测试是验证区间判断最快的方法,比读公式有效得多。做模板时把这六个测试值放在表格角落,每次改完公式扫一眼,能立刻发现漏档或重叠。
另外,嵌套 IF 里如果两个分支返回相同的值,说明判断可以合并。例如 =IF(C2>=90,"优秀",IF(C2>=80,"优秀","及格")) 里前两个分支一样,完全可以写成 =IF(C2>=80,"优秀","及格")。写完嵌套后回头扫一遍有没有重复分支,往往能把层数砍掉一半。
三、IFS:多条件判断的现代写法
=IFS(条件1,值1,条件2,值2,...) 按顺序检查每个条件,返回第一个为真的条件对应的值。上面的成绩分级用 IFS 写成 =IFS(C2>=90,"优秀",C2>=80,"良好",C2>=60,"及格",TRUE,"不及格"),结构完全扁平,一眼就能看出有四档。
IFS 最多支持 127 组条件与值的配对,日常用到五六个已经算多。它最大的好处是不用写嵌套括号,改起来也方便,插入一档只需加两个参数,不用动其他部分。
最后一组条件通常写成 TRUE 兜底,相当于其他语言里的 else。如果不写兜底条件,所有条件都不满足时 IFS 会返回 #N/A。这不是 bug,是设计如此,提醒你条件覆盖不完整。做模板时强烈建议加上兜底,写成 =IFS(...,TRUE,"其他")。
IFS 的缺点是兼容性。它是 Excel 2019 与 Microsoft 365 才有的函数,Excel 2016 及更早版本输入后会显示 #NAME?。要向下兼容就用嵌套 IF,或者用查表法。WPS 表格的新版本支持 IFS,老版本不支持,发文件前先确认对方的软件版本。
还有一个替代写法值得知道:SWITCH。当判断依据是同一个表达式的不同取值时,=SWITCH(A2,"已完成",1,"进行中",0.5,0) 比 IFS 更简洁。它适合离散值匹配,不适合区间判断,与 IFS 的分工很清楚。
四、条件怎么写:比较、文本、空值与容错
比较运算符包括等于、大于、小于、大于等于、小于等于、不等于六种,写成 =、>、<、>=、<=、<>。注意不等于是一个小于号加一个大于号,不是常见的感叹号等号。在公式里书写这些符号时,务必用半角字符。
文本比较要加英文双引号,例如 =IF(B2="市场部","是","否")。如果单元格里的文本带有前后空格,比较会失败。稳妥写法是 =IF(TRIM(B2)="市场部","是","否"),先用 TRIM 去掉多余空格再比较。日常做表时,建议在数据录入环节就用数据验证限制下拉选项,从源头减少这类比较失败。
判断空值有两种写法。=IF(A2="","空","非空") 会把公式产生的空文本也判为空白;=IF(ISBLANK(A2),"真空","有内容") 只把完全没内容的单元格判为真空。两者的区别在上一小节讲过,选哪个取决于你想识别哪一种空。
数值比较时最常见的坑是文本型数字。=IF(A2>100,"是","否") 在 A2 是文本 1000 时会返回否,因为文本永远大于任何数值。判断前先确认数据类型,或者写成 =IF(A2*1>100,"是","否") 强制转成数值。乘 1 是最简单的转换技巧,也可以用 VALUE 函数。
容错方面,IFERROR 是 IF 的常用搭档。写成 =IFERROR(1/A2,0),A2 为 0 或空白时返回 0 而不是错误。它比 =IF(ISERROR(1/A2),0,1/A2) 更短,而且表达式只写一次,不会出现两处不一致的问题。兜底写法的更多内容见 XLOOKUP 与 IFERROR:新写法和兜底。
五、真实场景
场景一:提成阶梯计算。销售额 10 万以下提成 3%,10 万到 30 万提成 5%,30 万以上提成 8%。写成 =IF(C2>=300000,C2*0.08,IF(C2>=100000,C2*0.05,C2*0.03)),注意判断顺序从高到低。如果想避免嵌套,也可以用 =C2*LOOKUP(C2,{0,100000,300000},{0.03,0.05,0.08}),后者更好维护。
场景二:状态自动标记。订单表里 D 列是发货日期,E 列是签收日期。状态写成 =IF(E2<>"","已签收",IF(D2<>"","已发货","待发货")),两个条件依次判断,逻辑清晰。把这一列用在条件格式里,不同状态显示不同颜色,一张表就变成了看板。
场景二的补充:状态判断有时会漏掉异常组合。比如发货日期为空但签收日期不为空,逻辑上讲不通,却能通过上面那条公式。稳妥做法是加一层校验:=IF(AND(D2="",E2<>""),"数据异常",IF(E2<>"","已签收",IF(D2<>"","已发货","待发货")))。多写的这一层校验,能在数据出错时立刻暴露问题,而不是让错误一路流到报表里。
场景三:异常值预警。库存量低于安全库存时提示补货,写成 =IF(D2<E2,"需补货"&E2-D2,"")。字符串拼接用连接符,把缺口数量直接写进提示语,比只提示补货更有信息量。如果还要区分紧急程度,再加一层 IF 判断缺口大小。
场景四:多条件综合判断。判断是否为重点客户,需要同时满足年采购额大于 50 万且回款率大于 90%,写成 =IF(AND(C2>500000,D2>0.9),"重点","普通")。用 AND 把多个条件合成一个,比嵌套 IF 清晰得多。逻辑组合的完整说明见 AND、OR、NOT 与布尔运算。
场景五:日期区间判断。判断某日期是否在本月内,写成 =IF(AND(A2>=EOMONTH(TODAY(),-1)+1,A2<=EOMONTH(TODAY(),0)),"本月","非本月")。用 EOMONTH 取上月末加一天作为月初,取本月末作为月末,边界精确,不必关心当月到底是 28 天还是 31 天。把这两个边界值放在单元格里而不是写进公式,还能避免重复计算。
六、让 IF 更好读的几个习惯
第一个习惯是把阈值放到单元格里。=IF(C2>=60,"及格","不及格") 改成 =IF(C2>=$F$1,"及格","不及格"),及格线写在 F1 里,改标准不用动公式。做给业务同事用的模板时,这一步能省掉大量沟通,因为他们可以自己调数字而不必找你改公式。
第二个习惯是给判断结果留注释列。复杂的 IF 判断旁边加一列说明列,用简短文字写清这个判断的口径是什么。半年后回看表格,或者交接给同事时,这一列的价值远超它的成本。也可以在单元格上右键插入批注,效果相同。
| 习惯 | 反面做法 | 推荐做法 | 收益 |
|---|---|---|---|
| 阈值外置 | 阈值写死在公式里 | 阈值放单元格,公式引用 | 改标准不动公式 |
| 顺序一致 | 区间顺序随意穿插 | 统一从大到小或从小到大 | 逻辑不会漏档 |
| 兜底分支 | 依赖默认 FALSE | 显式写第三参数或 TRUE 兜底 | 不出现意外结果 |
| 拆分验证 | 一行写十层嵌套 | 拆到辅助列逐层验证 | 出错能快速定位 |
| 返回类型 | 数值与文本混在一列 | 计算列与提示列分开 | 后续可直接求和 |
第三个习惯是先写伪代码再写公式。遇到复杂判断,先在纸上用中文写清规则:如果 A 且 B 则甲,否则如果 C 则乙,否则丙。把这棵决策树写清楚,再翻译成公式,出错率会大幅下降。很多人写不对嵌套 IF,本质上不是函数不会用,而是规则本身没想清楚。
第四个习惯是用条件格式代替部分判断。如果判断的目的只是为了标色,那根本不需要 IF 公式,直接在条件格式里写判断条件即可,表格更干净,也不会产生多余的列。判断结果需要参与后续计算时才真正需要 IF。
常见问题
IF 公式返回 FALSE 是怎么回事
因为第三个参数被省略了。写 =IF(C2>=60,"及格") 时,条件不成立返回 FALSE。补全第三参数即可,想要空白就写成 =IF(C2>=60,"及格","")。还有一种情况是第二参数写成了一对引号里带空格,看起来是空白实际不是,用 =LEN(结果) 检查长度就能区分。
嵌套 IF 返回了错误的结果,怎么排查
用公式求值功能逐步查看。在公式选项卡里点击公式求值,反复点求值按钮,能看到每一步的中间结果,通常两三步就能定位出错的那层。更快的办法是拆开验证:把每一层 IF 单独放到一个单元格里,看哪一层的判断不符合预期。多层嵌套的调试几乎都靠这两招。
IF 和条件格式、数据验证怎么配合
条件格式里可以直接写 IF 的判断条件,不需要 IF 函数本身,例如规则写成 =$C2>=60 即可标色。数据验证里则可以用 IF 的思路限制录入,例如自定义规则写 =C2<=1000000 防止金额录得过大。三者配合能把大量人工检查自动化:数据验证挡在录入时,IF 负责计算与标记,条件格式负责呈现。
嵌套层数真的不能超过 7 层吗
这是 Excel 2003 及更早版本的限制,现代 Excel 允许 64 层,实际约束来自可读性而不是软件。超过三层就应该考虑换写法。最实用的替代是查表法:把判断规则放进一张对照表,用 VLOOKUP 或 XLOOKUP 查找,规则变更时只改表格不动公式,也方便业务同事自己维护。
IFS 在自己的 Excel 里提示名字错误
说明版本不支持。IFS 是 Excel 2019 与 Microsoft 365 引入的函数,Excel 2016 及更早版本没有。解决方案:升级;改用嵌套 IF;或者用查表法。如果文件要发给很多人看,建议一律用最保守的写法,也就是嵌套 IF 加对照表,兼容性最好,牺牲的只是一点书写便利。
IF 里能不能再放一个 IFERROR
可以,而且这是很实用的组合。例如 =IF(A2="","",IFERROR(VLOOKUP(A2,表,2,0),"未找到")),先判断空白直接返回空,非空时才去查找并兜底。顺序很重要:先做便宜的判断,再做昂贵的查找,既能提速也能减少无意义的错误提示。查找类函数的兜底写法在 XLOOKUP 与 IFERROR:新写法和兜底 里有更多例子。
判断条件里能直接写中文吗
能,但要加英文双引号。写 =IF(B2="已完成",1,0) 是对的,写成 =IF(B2=已完成,1,0) 会被当成名字引用而返回 #NAME?。另外要注意中文输入法下容易打出全角引号,全角引号在公式里不被识别,输入公式前先切到英文输入法,能省掉一大半莫名其妙的错误。
判断文本相等时,大小写会影响吗
Excel 的比较运算默认不区分大小写,写 =IF(A2="YES","是","否") 时,单元格里是 yes 也会返回是。如果确实需要区分大小写,用 EXACT 函数,写成 =IF(EXACT(A2,"YES"),"是","否")。多数业务场景不需要区分,但做账号、编码校验时会用到,知道有这个函数就够了。
一个单元格里能返回两个结果吗
传统 Excel 里不能,一个公式只能返回一个值,返回多个需要按 Ctrl 加 Shift 加 Enter 并选中多个单元格。Excel 365 与 WPS 新版支持动态数组,公式会自动溢出到相邻单元格。如果需要返回的是一串文本,可以先拼接成一个字符串,用 =IF(A2>0,"达标 "&B2,"") 这样的写法,把多个信息塞进一个单元格。
IF 返回的结果能直接参与求和吗
能,但前提是返回的是数值而不是文本。写成 =IF(C2>=60,C2,0) 可以直接求和;写成 =IF(C2>=60,C2,"无") 则会让 SUM 忽略这些文本,导致合计偏小。凡是要参与计算的分支,一律返回数值,需要提示时另起一列写文本,两者分开是规范做法。
