关于LET语句中含IF子句的执行顺序疑问及函数调用异常
解决Excel LET函数中SLOW()函数被预执行的问题
问题本质
Excel的LET函数会预计算所有定义的变量和后续表达式中的所有子表达式,哪怕这些子表达式在逻辑分支中不会被用到。这就是为什么你写=LET(nr,QUICK(),IF(nr<50,SLOW(),nr))时,不管nr是否小于50,SLOW()都会先被执行——因为它是IF函数的参数之一,在LET的预计算阶段就被触发了。
而分开写的=IF(A1<50,SLOW(),A1)能正常惰性执行,是因为Excel对单元格引用的计算是懒加载的:只有当条件满足时,才会去计算SLOW()所在的分支逻辑。
解决方案:用LAMBDA实现惰性执行
要在LET内部实现仅当条件满足时才执行SLOW(),可以用LAMBDA函数把SLOW()包装起来,因为LAMBDA只有被调用(加括号执行)时才会运行内部的代码。
修正后的公式示例:
=LET( nr, QUICK(), IF(nr<50, LAMBDA(SLOW())(), nr) )
或者更清晰地先定义lambda变量:
=LET( nr, QUICK(), get_exact, LAMBDA(SLOW()), IF(nr<50, get_exact(), nr) )
原理说明
- 包装后的
LAMBDA(SLOW())本身是一个函数对象,不会立即执行SLOW() - 只有当条件
nr<50成立时,get_exact()(或直接调用lambda)才会触发,进而执行SLOW() - 条件不成立时,lambda不会被调用,
SLOW()也就不会执行
内容的提问来源于stack exchange,提问作者DS_London
相关产品推荐
相关产品推荐

