Excel发布新功能LAMBDA:将公式转换为⾃定义函数
⽇前,微软宣布在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函数的⽰例。
假设我们有以下公式:
在公式中, x是调⽤LAMBDA时可以传递的参数,⽽x + 122 是逻辑。
例如,假设调⽤了lambda并为x输⼊值1,则Excel将执⾏以下计算:
⽽1+122=123
命名lambda
如果对LAMBDA命名,就可以实现简单重⽤,为了达到该⽬的需要需要使⽤名称管理器。
可以在功能区中到"名称管理器",⽅法是:lambda编程
公式>名称管理器
打开名称管理器后,将看到以下窗⼝
创建⼀个新条⽬(New…)并填写相关字段
名称Name:要创建的函数名称
注释Comment:调⽤函数时将显⽰说明和相关的提⽰
Refers引⽤:lambda函数定义
完成后,单击OK保存该lambda,并且应该在结果窗⼝中看到返回的定义。
然后就可以通过按其名称调⽤⼯作簿中的新创建的⾃定义函数。
调⽤LAMBDA
简⽽⾔之,调⽤lambda函数的⽅式与在Excel中调⽤本机函数的⽅式相同。
例如对前⾯的⽰例,可以直接调⽤MYLAMBDA :
返回值:123
最后要注意的⼀点是,可以在不命名的情况下调⽤lambda。如果没有命名前⾯的公式,⽽只是在⽹格中编写它,可以如下调⽤它:
这将为x传递1,并返回123
可重⽤的⾃定义功能
在Excel中使⽤公式的更具挑战性的部分之⼀是经常会使⽤相当复杂的公式,这些公式在⼯作表中多次重复使⽤(通常仅通过复制/粘贴)。这样会使其他⼈很难阅读和理解其功能,⽽且更容易出错,进⾏故障分析和修复也⽐较困难。使⽤LAMBDA,可以重复使⽤并具有可组合性。
假设有⼀个序号列表,其中位置编码(双字母)在需要中,需要将该值提取出来:
使⽤Excel函数有很多⽅法可以做到这⼀点,⽐如使⽤LET公式:
将公式并将其复制到状态列中,就能⾃动获得结果。
这种⽅法有两个问题:
易错误:如果发现需要纠正的逻辑错误,则必须返回并在错误的地⽅进⾏更新。此外,每当⼀遍⼜⼀遍地重复复杂的公式(⽽不是⼀次定义然后引⽤)时,都会存在风险。例如,如果有序列号为"105532-872332-WA-73",那么⽤上述公式就出错。如果发现这样的问题并要修复,则需要对使⽤该公式的每个单元格都要进⾏更新。
可组合性/可读性差:如果是使⽤别⼈的公式,则很难知道该公式的意图(提取位置)。也不好将该公式和其他公式结合使⽤,例如,如果想获取到位置并根据结果值进⾏查。
使⽤LAMBDA,可以创建⼀个名为GETLOCATION的函数,并将公式逻辑放⼊该函数的定义中。
注意,指定了函数要使⽤的参数(在本例中为SN)以及函数的逻辑。然后在电⼦表格,可以简单的写的getLocation 作为⼀个公式,和任何其他Excel函数⼀样。如果发现错误,则将只需修复⼀个位置,并且使⽤该功能的所有位置都会⾃动修复。
另外还可以使⽤其他逻辑来组合该功能。例如,如果每个位置的税率表,则可以编写此简单公式以根据SN返回税率。
递归
Excel公式中最⼤的遗漏项之⼀是缺乏循环功能,以动态定义的间隔重复⼀组逻辑。可以通过多种⽅式⼿动配置Excel重新计算的间隔,以在⼀定程度上模拟该间隔,但这并不是公式语⾔所固有的。
假设我有⼀组字符串,并且我们要指定应该从这些字符串中动态删除哪些字符:
由于指定的字符集不是静态的,因此确实没有任何好的⽅法。如果是⼀组固定的字符,则可以通过⼤量的嵌套逻辑公式来实现,但这将⾮常复杂并且容易出错。还要考虑如果要删除的字符数⼤于设想的字符数就会报错失败。
使⽤LAMBDA,可以创建⼀个称为REPLACECHARS 的函数,该函数引⽤⾃⾝,然后循环调⽤要删除的字符列表:
注意,在REPLACECHARS的定义中,有⼀个对REPLACECHARS的引⽤。IF语句表明如果没有更多⾮法字符,则返回输⼊textString,否则,将每次出现在invalidChars中最左边的字符都删除。递归开始于使⽤更新的字符串和其余的invalidChars再次调⽤REPLACECHARS 的请求。这样它会⼀直调⽤⾃⼰,直到对要删除的每个字符进⾏了解析,从⽽获得了所需的结果。不仅是数字和字符串
关注Excel改进的同学可能会注意到在Excel中可以使⽤的数据类型有两项重⼤改进:
动态数组:可以传递值数组,⽽不是将单个值传递给函数,函数还可以返回值数组。
数据类型:存储在单元格中的值不再只是字符串或数字。单个单元格可以包含具有⼤量属性的丰富数据类型。
函数可以将数据类型和数组作为参数,也可以将结果作为数据类型和数组返回。构建的lambda是同样
的道理。
假如有⼀个城市列表,如果要按顺序去每个城市,需要计算出旅⾏的总距离。基本解决思路是:
有⼀系列的City数据类型。城市数据类型具有经度和纬度属性。
使⽤纬度和经度,可以使⽤地球半径来近似估算两点之间的距离(这是第⼀个Lambda,我们称为DistanceBetweenCities)
创建⼀个递归lambda DistanceBetweenMultipleCities,以迭代数组中的城市。除了调⽤⾃⾝之外,要遍历城市列表,它还调⽤DistanceBetweenCities 函数以获取⾏驶距离的运⾏总和。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论