今天遇到群友问一个 Excel 的 IF 嵌套公式,无法返回他要的结果,然后群友反应热烈,很多人都表示遇到过这个问题,当时的感受是抓破头都没想明白……
这条公式是这样的:
= IF(C4<80%, 0, IF(80%<=C4<100%, C4*C11, IF(100%<=C4<110%, C4*D11, IF(110%<=C4<120%, C4*E11, IF(C4>120%, C4*F11)))))
公式有点长,可以排版一下,更方便查看:
= IF(C4 < 80%, 0,
IF(80% <= C4 < 100%, C4 * C11,
IF(100% <= C4 < 110%, C4 * D11,
IF(110% <= C4 < 120%, C4 * E11,
IF(C4 >= 120%, C4 * F11
)
)
)
)
)
ps:Excel 公式的排版网站在这儿→https://www.formulaboost.com/parse
写公式时想表达的逻辑是:
当 C4 < 80%
时就返回0
当 80% <= C4 < 100%
时就返回C4 * C11
当 100% <= C4 < 110%
时就返回C4 * D11
当 110% <= C4 < 120%
时就返回C4 * E11
当 C4 >= 120%
时就返回C4 * F11
逻辑是很清晰了!
但 Excel 就是“不讲道理”,返回的结果就不对!你说气人不气人?
原因
其实问题就出在80% <= C4 < 100%
、100% <= C4 < 110%
、110% <= C4 < 120%
的写法上。
比如 80% <= C4 < 100%
这个写法,Excel 是从左到右去计算的,首先会将 C4
与 80%
比较,得到一个 TRUE
或 FALSE
的结果,然后将这个结果与 100%
比较,再得到一个 TRUE
或 FALSE
的结果。这是为什么语法上并没有报错的原因,它是可以执行的,只是结果不是你想要的罢了。
所以公式要表达的逻辑,正确的写法是:AND(80% <= C4, C4 < 100%)
,这才是表示: C4 单元格的值大于 80% 而且小于 100%
没办法,这是 Excel 的地盘,必须要按它的运行逻辑来写……
所以原来的公式可以改成:
= IF(C4 < 80%, 0,
IF(AND(80% <= C4, C4 < 100%), C4 * C11,
IF(AND(100% <= C4, C4 < 110%), C4 * D11,
IF(AND(110% <= C4, C4 < 120%), C4 * E11,
IF(C4 >= 120%, C4 * F11
)
)
)
)
)
优化
其实上面的写法是有点啰嗦的,既然 Excel 公式是从左到右计算的。(除非你用括号让右边的先计算)
那么在上面的公式中,首先计算的就是C4 < 80%
:
如果 C4 < 80%
计算结果为TRUE
,就直接返回公式中的第二参数0
,然后公式就停止计算了如果 C4 < 80%
计算结果为FALSE
,就进入第二层 IF 函数继续计算
如果你还搞不太懂公式的计算顺序,可以使用 Excel 的公式求值功能,让你可以更有感觉!
公式求值所以如果公式能进入第二层 IF 函数,表明了C4 < 80%
为FALSE
,即 C4 >= 80%
,所以在第二层 IF 函数的判断条件中,我们无需要再写 C4 >= 80%
这个条件了!(当然你写了也不影响结果,只是啰嗦没必要~)
所以直接把上面的公式中的 AND
函数去掉,就精简成这个效果:
= IF(C4 < 80%, 0,
IF(C4 < 100%, C4 * C11,
IF(C4 < 110%, C4 * D11,
IF(C4 < 120%, C4 * E11, C4 * F11)
)
)
)
上面这些公式虽然加了换行(Alt + Enter),但直接复制到 Excel 里,公式都是可以正常使用的,如果不喜欢这种结构,那就用回这种一行的形式吧:
=IF(C4 < 80%, 0, IF(C4 < 100%, C4 * C11, IF(C4 < 110%, C4 * D11, IF(C4 < 120%, C4 * E11, C4 * F11))))
但建议在写公式时,遇到逗号应该在它后面加个空格,这样在看长公式时会舒服一些。
另外,我也建议把其中的百分数转换成小数,不仅更精简,计算速度也会更快些:
=IF(C4 < 0.8, 0, IF(C4 < 1, C4*C11, IF(C4 < 1.1, C4*D11, IF(C4 < 1.2, C4*E11, C4*F11))))
如果你使用 Excel 2019 版本,以上这种 IF 嵌套公式,可以直接使用 IFS 函数,使用起来就更方便了:
=IFS(
C4 < 0.8, 0,
C4 < 1, C4 * C11,
C4 < 1.1, C4 * D11,
C4 < 1.2, C4 * E11,
C4 >= 1.2, C4 * F11
)
这样看起来就更清晰,而且简洁,赶紧让老板给你换新版本(目前最新是 Office 2021)吧~
再优化
对于这种多条件的判断,在提成比例计算、数字分组时是经常用到的,如果你的条件达到 5 层以上,整个公式会变得非常复杂,这时可以用 VLOOKUP
的模糊匹配来替代 IF 嵌套。
首先,需要将区间界限(0.8, 1, 1.1, 1.2)以及公式中单元格对应的系数(C11, D11, E11, F11)整理成一张匹配表,并且按照区间界限从小到大排序。
匹配表然后就可以使用 VLOOKUP
来实现和上面的公式同样的计算效果:
= C4 * VLOOKUP(C4, A2:B6, 2, TRUE)
其中 VLOOKUP(C4, A2:B6, 2, TRUE)
部分,就是负责根据 C4 的值去匹配对应的系数回来,利用的是 VLOOKUP
第四个参数设置为 TRUE
的效果:
当把
VLOOKUP
的第四个参数设为TRUE
时,它表示进行近似匹配(区间查找模式)。这时 VLOOKUP 函数就会找到第一个小于或等于C4
的值,并返回它所在的行的第2
列的值。
划重点
最后划一下文章的重点:
若要表达 80% <= C4 < 100%
,在 Excel 中要写成AND(80% <= C4, C4 < 100%)
的形式上层 IF 判断过的条件,下一层 IF 中无需重复判断 可以把公式中的百分数换成小数,既简洁,计算效率也高 多层 IF 嵌套可以使用 IFS 来写一层实现,更清晰 数字区间的多层 IF 嵌套,可以使用 VLOOKUP
来精简
好的,希望文章能对你有帮助🚀🚀🚀