Excel 复杂公式简化、优化、提升运算性能,强烈推荐最强自定义过程函数LET

上一篇分享的提取科目前3名姓名的案例,公式特别长,怎么简化公式呢?想要公式写得好看,用LET函数。
LET函数可以定义名称,并赋值,再定义一个使用定义名称的计算,作为输出项。是不是像编程中变量?
LET可以多次调用定义名称,减少计算次数,性能提升不少,关键是能够像代码一样优美丝滑,方便阅读与撰写。
LET函数语法:=LET(名称1,名称1的值,[名称2],[名称2的值],……,输出项)
注意:最后一个参数必须是会返回结果的计算;定义名称不能重复,不能与内置函数名称冲突。
我们看看上一篇案例用LET函数怎么写?

在M4单元格输入,=LET(),先定义一个名称rng,把包含姓名和科目成绩的数据区域C3:J20赋值给它;因为经常要用到科目位于数据区域中第几列,再定义一个名称m,用Match查找科目位于第几列,赋值给m。

如果想某一个定义名称的结果是不是正确的,可以把名称作为最后一个参数,就可以查看结果是否正确。
我们接着按照刚刚的步骤往下写:
第一步,取选择科目的成绩。定义名称col,使用CHOOSECOLS(rng,m)动态获取科目所在列的所有成绩。到这里就看到了let函数的强大之处了。

到这一步的整个公式是=LET(rng,C3:J20,m,MATCH(L5,C2:J2,0),col,CHOOSECOLS(rng,m),col)
第二步,找出科目第三名的数值。定义名称k,使用LARGE函数获取科目成绩中,也就是col中的第3个最大值,同样为防止有并列成绩出现,LARGE内嵌套一个UNIQUE。

到这一步的公式是=LET(rng,C3:J20,m,MATCH(L5,C2:J2,0),col,CHOOSECOLS(rng,m),k,LARGE(UNIQUE(col),3),k)。
第三步,筛选出科目前三名的数据。再定义一个名称filterrng,筛选区域用rng,条件列col,条件>=k。

到这一步的公式是=LET(rng,C3:J20,m,MATCH(L5,C2:J2,0),col,CHOOSECOLS(rng,m),k,LARGE(UNIQUE(col),3),filterrng, FILTER(rng,col>=k), filterrng)。
第四步,对筛选后的科目成绩执行排序。在一步的Filter函数外面嵌套一个Sort,排序依据为m,排序方式选择降序-1。

这一步的公式是=LET(rng,C3:J20,m,MATCH(L5,C2:J2,0),col,CHOOSECOLS(rng,m),k,LARGE(UNIQUE(col),3),filterrng,SORT(FILTER(rng,col>=k),m,-1), filterrng)
第五步,提取、合并姓名。这一步是最后输出,就不再定义新的名称了,当然你也可以定义一个名称,并作为最后输出项。
先提取姓名列,用CHOOSECOLS(filterrng,1),再使用TEXTJOIN合并文本,使用、为分隔符。

最终公式:=LET(rng,C3:J20,m,MATCH(L5,C2:J2,0),col,CHOOSECOLS(rng,m),k,LARGE(UNIQUE(col),3),filterrng,SORT(FILTER(rng,col>=k),m,-1),TEXTJOIN("、",,CHOOSECOLS(filterrng,1)))。
公式还是比较长,但层次分明,便于理解与阅读,你觉得呢?