将列表转换为元组的内置函数为_Excel发布新功能LAMBDA:将公式转换为自定义函数...

620d10912adef0421aa01c899517d475.png

日前,微软宣布在Excel Insider Beta版本中发布了一项新功能LAMBDA。Excel公式是世界上使用最广泛的编程语言,方便快捷的Excel公式也是大家最常用的功能,但是Excel公式的死的无法自定义。如果能在其基础上进行自主定义和编程是一个很大使用场景,现在这个愿望可以达成了,使用LAMBDA可以基于公式实现可自定义可重用函数的能力。

概述

简而言之,LAMBDA允许用户将Excel的公式语言来定义自己的自定义功能。Excel已经允许定义自定义函数,但是只能通过使用完全不同的语言(例如VBA,JavaScript)编写它们。LAMBDA则可以让用户使用Excel自己的公式语言定义自定义函数。还支持在函数中调用其他函数,通过函数调用可以部署的功能不受限制。在很多语言中,有函数式编程的lambda语法,同样的LAMBDA的引入标志着Excel公式语言完成了图灵完备。

使用LAMBDA,可以通过Excel中现有公式,并将其打包为在LAMBDA函数,并重命名命名。然后,就可以在工作表中的任何地方引用该函数,在整个工作表中可以重复使用该自定义函数。

LAMBDA还支持递归。例如,如果创建一个名为MYFUN的LAMBDA,则可以在MYFUN的定义内调用MYFUN。此前,递归功能必须通过脚本来实现。

LAMBDA基础

= LAMBDA包含以下三个关键部分:LAMBDA功能组件,命名lambda和调用lambda函数

LAMBDA功能组件

一个创建基本lambda函数的示例。

假设我们有以下公式:

=LAMBDA(x, x+122)

在公式中, x是调用LAMBDA时可以传递的参数,而x + 122 是逻辑。

例如,假设调用了lambda并为x输入值1,则Excel将执行以下计算:

1 + 122

而1+122=123

命名lambda

如果对LAMBDA命名,就可以实现简单重用,为了达到该目的需要需要使用名称管理器。

可以在功能区中找到"名称管理器",方法是:

公式>名称管理器

5734618b1c11e88ad52c20577f540624.png

打开名称管理器后,将看到以下窗口

8cb951e32ebe23bba40014ab18fd947b.png

创建一个新条目(New…)并填写相关字段

34f61d566fca6eda68d53b67f13e010c.png

名称Name:要创建的函数名称

注释Comment:调用函数时将显示说明和相关的提示

Refers引用:lambda函数定义

完成后,单击OK保存该lambda,并且应该在结果窗口中看到返回的定义。

bc2914febd80ce46417e76abaf1f1a85.png

然后就可以通过按其名称调用工作簿中的新创建的自定义函数。

调用LAMBDA

简而言之,调用lambda函数的方式与在Excel中调用本机函数的方式相同。

例如对前面的示例,可以直接调用MYLAMBDA :

= MYLAMBDA(122)

返回值:123

最后要注意的一点是,可以在不命名的情况下调用lambda。如果没有命名前面的公式,而只是在网格中编写它,可以如下调用它:

=LAMBDA(x, x+122)(1)

这将为x传递1,并返回123

可重用的自定义功能

在Excel中使用公式的更具挑战性的部分之一是经常会使用相当复杂的公式,这些公式在工作表中多次重复使用(通常仅通过复制/粘贴)。这样会使其他人很难阅读和理解其功能,而且更容易出错,进行故障分析和修复也比较困难。使用LAMBDA,可以重复使用并具有可组合性。

假设有一个序号列表,其中位置编码(双字母)在需要中,需要将该值提取出来:

081be92705c10ec0275f826dedf1a786.png

使用Excel函数有很多方法可以做到这一点,比如使用LET公式:

=LEFT(RIGHT(A2,LEN(A2)-FIND("-",A2)),FIND("-",RIGHT(A2,LEN(A2)-FIND("-",A2)))-1)

将公式并将其复制到状态列中,就能自动获得结果。

这种方法有两个问题:

易错误:如果发现需要纠正的逻辑错误,则必须返回并在错误的地方进行更新。此外,每当一遍又一遍地重复复杂的公式(而不是一次定义然后引用)时,都会存在风险。例如,如果有序列号为"105532-872332-WA-73",那么用上述公式就出错。如果发现这样的问题并要修复,则需要对使用该公式的每个单元格都要进行更新。

可组合性/可读性差: 如果是使用别人的公式,则很难知道该公式的意图(提取位置)。也不好将该公式和其他公式结合使用,例如,如果想获取到位置并根据结果值进行查找。

使用LAMBDA,可以创建一个名为GETLOCATION的函数,并将公式逻辑放入该函数的定义中。

=LAMBDA(SN, LEFT(RIGHT(SN,LEN(SN)-FIND("-",SN)),FIND("-",RIGHT(SN,LEN(SN)-FIND("-",SN)))-1))

注意,指定了函数要使用的参数(在本例中为SN)以及函数的逻辑。然后在电子表格,可以简单的写的getLocation 作为一个公式,和任何其他Excel函数一样。如果发现错误,则将只需修复一个位置,并且使用该功能的所有位置都会自动修复。

44d117d3ff429343a0e7a06489e3c8b3.png

另外还可以使用其他逻辑来组合该功能。例如,如果每个位置的税率表,则可以编写此简单公式以根据SN返回税率。

=XLOOKUP(GETLOCATION(B2), table1[locations], table1[tax])

递归

Excel公式中最大的遗漏项之一是缺乏循环功能,以动态定义的间隔重复一组逻辑。可以通过多种方式手动配置Excel重新计算的间隔,以在一定程度上模拟该间隔,但这并不是公式语言所固有的。

假设我有一组字符串,并且我们要指定应该从这些字符串中动态删除哪些字符:

e5d8b6d47d94bebd8eb3d679c7f75494.png

由于指定的字符集不是静态的,因此确实没有任何好的方法。如果是一组固定的字符,则可以通过大量的嵌套逻辑公式来实现,但这将非常复杂并且容易出错。还要考虑如果要删除的字符数大于设想的字符数就会报错失败。

使用LAMBDA,可以创建一个称为REPLACECHARS 的函数,该函数引用自身,然后循环调用要删除的字符列表:

=LAMBDA(textString, illegalChars,IF(illegalChars="", textstring,REPLACECHARS(SUBSTITUTE(textString, LEFT(illegalChars, 1), ""),RIGHT(illegalChars, LEN(illegalChars)-1))))

注意,在REPLACECHARS的定义中,有一个对REPLACECHARS的引用。IF语句表明如果没有更多非法字符,则返回输入textString,否则,将每次出现在invalidChars中最左边的字符都删除。递归开始于使用更新的字符串和其余的invalidChars再次调用REPLACECHARS 的请求。这样它会一直调用自己,直到对要删除的每个字符进行了解析,从而获得了所需的结果。

cdff824bb351fee486d33e418a2f0669.gif

不仅是数字和字符串

关注Excel改进的同学可能会注意到在Excel中可以使用的数据类型有两项重大改进:

动态数组:可以传递值数组,而不是将单个值传递给函数,函数还可以返回值数组。

数据类型:存储在单元格中的值不再只是字符串或数字。单个单元格可以包含具有大量属性的丰富数据类型。

函数可以将数据类型和数组作为参数,也可以将结果作为数据类型和数组返回。构建的lambda是同样的道理。

假如有一个城市列表,如果要按顺序去每个城市,需要计算出旅行的总距离。基本解决思路是:

有一系列的City数据类型。城市数据类型具有经度和纬度属性。

使用纬度和经度,可以使用地球半径来近似估算两点之间的距离(这是第一个Lambda,我们称为DistanceBetweenCities)

创建一个递归lambda DistanceBetweenMultipleCities,以迭代数组中的城市。除了调用自身之外,要遍历城市列表,它还调用DistanceBetweenCities 函数以获取行驶距离的运行总和。

85a6ac00c878a58222c37374da541190.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值