分享

Excel竟然还可以创建这样的函数:FUNCTION(x)(data)

 zonge 2025-02-25

今天介绍嵌套LAMBDA函数的使用。

LAMBDA函数的语法如下:

=LAMBDA([parameter1, parameter2, …,] calculation)

其中的parameter是参数,可以是数组,单元格区域,数值,或者LAMBDA函数。

最后的calculation也可以是LAMBDA函数。如果是这样,我们就使用了嵌套的LAMBDA函数。

例如,

 TESTFUNC = LAMBDA(x, LAMBDA(a, a + x))

就是一个嵌套的LAMBDA函数。

TESTFUNC的逻辑非常简单,一眼就可以明白它要什么。但是要分析其运行过程却并不是一目了然的。

其使用逻辑可以用下图表示:

图片

对这个函数的调用使用公式:

=TESTFUNC(x)

x被作为参数传递给外层的LAMBDA函数,外层的LAMBDA函数需要根据计算逻辑处理并返回。这个计算逻辑就是内层的LAMBDA函数:

=LAMBDA(a, a+X)

这里的a是参数,x不再是参数。x是外层LAMBDA函数传递进来的,对内层LAMBDA函数来说,相当于常量。

内层的LAMBDA函数需要根据计算逻辑返回,这个计算逻辑就是:

a+x
嵌套LAMBDA函数的调用

这个函数并不能像以前我们创建过的自定义函数一样调用。

注意,外层的LAMBDA函数只能接收一个参数,所以,只能写成:

=TEXTFUNC(10)

根据上面的分析,这个公式返回了一个LAMBDA函数:

LAMBDA(a,a+x)

显然,此时x=10,因此,这个LAMBDA函数变成了:

LAMBDA(a, a+10)

这个函数是需要输入参数的,比如:

LAMBDA(a, a+10)(5)

结果就是15。

综合上面的过程,TESTFUNC应该用如下形式调用:

=TESTFUNC(10)(5)

其中第一个括号内是外层LAMBDA函数的参数,第二个括号中是内层LAMBDA函数的参数。

等价形式

仔细想一下,就会发现,上面的TESTFUNC完全可以用如下的代码创建:

TESTFUNC1 = LAMBDA(x, a, a + x)

从计算逻辑上来说,二者完全等价。只是调用方式不同。TESTFUNC1用普通的方式调用即可:

=TESTFUNC1(10, 5)

那么我们为什么还有使用嵌套的形式呢?

实际上,大部分场景中,我们都不建议写成嵌套的调用,尤其是多层嵌套。不过,在某些场景中,这么做可以得到一些好处。

语义上的好处

其实,大部分好处都是“语义”上的。

比如,Excel中有一个TEXTSPLIT函数,是通过分隔符对文本进行拆分,假设你遇到这样一个公式:

=TEXTSPLIT(A3, B3)

如果你不是对这个函数非常熟悉的话,你一定很困惑A3和B3哪一个是要拆分的文本,哪一个是分隔符。

但是,假如有这样一个公式:

=TEXTSPLITBY(B3(A3)

注意,这里的函数的第一部分是:

TEXTSPLITBY(B3)

完全可以翻译成“根据B3拆分文本”,

那么整个公式就是:

“根据B3拆分文本:A3”

这样的公式调用可读性更强,可维护性也更好一些。尤其是数据处理逻辑比较复杂的时候。

实际上,我们就是将这个处理逻辑中的参数分为两部分:

一组是需要直接进行处理的数据,另外一组是处理过程中的参数。

下面的例子中,我们创建了一个公式,可以根据需要使用不同的统计方式:

STATISTICSFOR = LAMBDA(type,    
       LAMBDA(data,        
           SWITCH(            
           type,            
           "sum", SUM(data),            
           "count", COUNT(data),            
           "average", AVERAGE(data),            
           "median", MEDIAN(data),            
           "max", MAX(data),            
           "min", MIN(data)        
         )    
      )
 );

下面是这个函数的调用实例:

=STATISTICSFOR("SUM")(A1:A10)=STATISTICSFOR("average")(A1:A10)

很明显,分别是对A1:A10区域的求和和求平均值。

这个功能经常和其他自定义函数结合在一起使用:

ADDONE = LAMBDA(a, a + 1);
ADDTWO = LAMBDA(a, a + 2);
MYFUNCTION = LAMBDA(fn, LAMBDA(data, fn(data)));

其中,

ADDONE,ADDTWO是两个自定义函数,代表了不同的计算逻辑。

MYFUNCTION则根据选择的不同函数,实现不同的计算逻辑:

=MYFUNCTION(ADDONE)(A1:A10)

详细解释请看视频

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多