话说很长时间以来,工作表函数最让人诟病的地方之一,就是它缺少编程语言中变量的表达形式,这使得嵌套函数的编写和阅读都显得非常烦琐而臃肿。
最终,微软设计了一种全新的工作表函数编写结构,也就是LET函数。
=LET(变量名1,变量内容1,变量名2,变量内容2……,结果表达式)
上面LET函数的意思是先定义了一个变量,其名为a,其值为1。又定义了一个变量b,其值为2。最后运行表达式a+b,也就返回变量a和变量b的合计值:3。
LET函数的出现改变了工作表函数的编写方式。它既避免了嵌套函数中同一函数重复出现、重复运算的问题,提高了函数的运算效率;同时,也使函数嵌套层次表达更清晰,使函数的编写和调试都简单了许多。
以上图所示数据为例,需要根据A:B的成绩明细,查询D列人名的成绩;如果成绩大于等于60,则返回实际成绩,否则返回字符串”不及格”。
=IF(VLOOKUP(D2,A:B,2,0)>=60,
使用VLOOKUP(D2,A:B,2,0)查询D2人名的成绩,然后用IF函数判断查询结果是否符合要求。
=LET(
查询,VLOOKUP(D2,A:B,2,0),
IF(查询>=60,查询,"查无")
)
第3行代码判断变量查询的值是否大于60,并根据判断结果返回对应值。
只运行了一次。运行完成后,系统将运算结果赋值给变量查询,在之后使用中,系统直接取该变量的值,而不会造成函数重复运算。
需要说明的是,在LET未出现之前,我们通常使用TEXT函数来规避重复运算的问题。
=TEXT(VLOOKUP(D2,A:B,2,0),"[>60]0;;不及格")
但TEXT函数返回的结果是文本值,这对结果数据的聚合处理,比如求和、求平均值、最大值等造成了很大麻烦,毕竟聚合函数基本都会忽略文本数值👇
再举一个例子,说明LET函数如何使复杂嵌套函数的表达层次更清晰,同时编写和调试也更简单的。
如下图所示,有多张工作表,名字分别为财务部、销售部、IT部等,每张工作表的A列均为人名,B列为成绩。
简单而言,这是一个典型的多工作表数据查询案例。我们并不知道A列的人名具体出现在哪张工作表中,这需要函数嵌套来实现。
=IFERROR(VLOOKUP(A2,INDIRECT(LOOKUP(1,0/COUNTIF(INDIRECT({“财务部”,”销售部”,”IT部”}&”!a:a”),A2),{“财务部”,”销售部”,”IT部”}&”!a:b”)),2,0),”查无”)
该公式嵌套了6个函数,对于普通函数水平的朋友来说,无论是阅读理解,还是编写调试,都不容易。嵌套函数,它的计算顺序是由内而外的,这其实并不符合人类正常的思维方式,我们习惯的思维方向是从上到下。
=LET(
_工作表,{"财务部","销售部","IT部"},
_人名出现次数,COUNTIF(INDIRECT(_工作表&"!a:a"),A2),
_可用工作表,LOOKUP(1,0/_人名出现次数,_工作表),
_查询区域,INDIRECT(_可用工作表&"!a:b"),
_查询,VLOOKUP(A2,_查询区域,2,0),
_结果容错,IFERROR(_查询,"查无"),
_结果容错
)
第2行代码定义了一个变量_工作表,内容是一个工作表名称构成的常量数组{“财务部”,”销售部”,”IT部”}。
第3行代码使用COUNTIF函数计算A2人名在每个工作表A列出现的次数,赋值变量_人名出现次数
第4行代码使用LOOKUP函数,查询出现A2人名的工作表名称,赋值变量_可用工作表。
第5行代码使用INDIRECT函数构建目标工作表查询区域的引用,赋值变量_查询区域。
第6行代码使用VLOOKUP函数查询A2人名的成绩,赋值变量_查询。
第7行代码使用IFERROR函数对VLOOKUP查无结果的情况进行容错。
摊手,你看,每一行公式的运行目的都很明确,它的计算顺序是从上而下的,层次因此而清晰,也更有利于大家对公式的阅读、编写和调试。
有朋友可能会好奇,为什么变量名称前面增加了一个下划线_
摊手,这并不是必须的,但是它是一个良好的个人习惯。它的好处有两个,一个是阅读公式时快速识别是否变量,另外一个,当我们在LET函数中输入下划线_,系统就会自动弹出一个由变量名称组成的下拉列表,由此我们可以快速选中目标变量,提高函数编写效率。
除此之外,在LET函数后面的参数,可以调用前面定义的任意变量。比如,在以上公式中,我们定义了6个变量。在第8行代码,我们可以调用前面的任意变量——这极大提高了我们函数调试的效率。
换句话来说,如果公式最终返回的结果和我们预设不相符,我们可以快速分步查看每一个变量的运行结果,查找具体问题所在。
以下动画演示了如何查看A列人名所在工作表名等变量运算结果:
有些朋友会喜欢使用a、b、c这样单纯的字母去表达变量名称,通常并不推荐这么做,原因是在很多情况下,字母容易和单元格引用(例如A1)冲突。而使用_a、_b、_c完全可以避免这类问题。
除此之外,当公式的运算参数发生了变化,比如,由查询“财务部”,”销售部”,”IT部”三张工作表,变成了查询“财务部”,”销售部”,”IT部”,“生产部”四张工作表,我们只需要调整公式中的变量_工作表的内容表达式即可。这就很明显提高了代码维护的效率。
=LET(
_工作表,{"财务部","销售部","IT部","生产部"},
_人名出现次数,COUNTIF(INDIRECT(_工作表&"!a:a"),A2),
_可用工作表,LOOKUP(1,0/_人名出现次数,_工作表),
_查询区域,INDIRECT(_可用工作表&"!a:b"),
_查询,VLOOKUP(A2,_查询区域,2,0),
_结果容错,IFERROR(_查询,"查无"),
_结果容错
)
❶ 在函数编写过程中,按<ALT+Enter>组合键可以为公式换行,公式换行并不妨碍公式运算。
❷ 一个LET函数定义的变量,只能在当前单元格的公式中使用;如需多个单元格公式使用相同变量,应该使用「定义名称」功能。
❸ LET函数和「定义名称」功能很像,但「定义名称」的函数编写和调试都非常弱(渣渣灰);不过,定义名称这家伙可以搭配LAMBDA函数,实现通过工作表函数制作自定义函数——关于这,我们下期再聊咯。
❹ LET函数目前只存在于Excel2021及MS365版本中。
没了,今天分享的内容就这些,更多表格技巧欢迎扫码关注我们。
|
|
Office自学网公众号 |
|
Office自学网客服 |
|
打开微信扫一扫,Office自学网
专注分享软件安装和视频教程,让你一号在手,办公无忧!