乐于分享
好东西不私藏

上高中时没学会的 f(x),上班后用Excel还要学

上高中时没学会的 f(x),上班后用Excel还要学
记得前一阵子,小编看到别人的公式中用到了一大串带 f(x) 的结构很是羡慕,心想,这是啥新技术,感觉很实用:

=LET(f,LAMBDA(x,TOCOL(IF(C3:E6,x))),

          HSTACK(f(A3:A6),

                        f(B3:B6),

                        f(C2:E2),

                        f(C3:E6)))

于是,小编的好奇心又开始作祟了!

还记的数学课本里面的 f(x)吗?
这可是高中学习数学时痛苦的回忆(高考数学刚及格的我)。
高中数学人教A版必修第一册3.1.1“函数的概念”里正式引入的就是y=f(x) 这套记号,而且它和Excel里那个f()的思维方式几乎是同构的。这也是为什么微软要把Lambda起这个名字。
课本里 f(x) 到底是什么?
人教A版的定义是:
设A、B是非空的数集,如果按照某种确定的对应关系 f,使对于集合A中的任意一个数x,在集合B中都有唯一确定的数y和它对应,那么就称f:A→B 为从A到B的一个函数,记作y=f(x),x∈A。
细看这三部分:
x:自变量(输入),定义域是A。
f:对应法则(规则),这是函数的灵魂。
f(x):函数值(输出),所有f(x)凑起来叫值域。
记得当年老师还特意强调过一个常见误解:f(x)不是“f乘以x”,而是“把x传递给对应法则f之后得到的结果”。
数学写法
设 f(x)=x²+1,那么 f(3)=10,f(4)=17。
Excel写法(第一种定义名称法):
Lambda把一段逻辑命名成f最常见。Excel365和WPS新版本支持Lambda,可以把一个计算逻辑存成名称,调用时就像 f(参数) 一样用。
比如要求含税单价
点击“公式”,点击“名称管理器”:
点击“新建”:
名称”填 f,引用位置写:
=Lambda(x, x*1.10)

点击“保存

回到表格里就能直接写公式了:

=f(B2:B4)

B2=100 就返回100*1.1=110

B3=68 就返回68*1.1=74.8

B4=25 就返回25*1.1=27.5

相当于你自己造了一个 f() 函数。

Excel写法(第二种vba方案):

Alt+F11 打开VBA编辑器

点击“插入”

点击“模块”

此时插入了一个“模块1”,我们需要在“模块1”右侧的代码录入窗口输入vba代码。

输入如下代码:

Function f(x)

    f=x*1.1

End Function

点击“保存”
回到Excel主界面后就可以输入公式了:

=f(B2)

下拉填充公式后得到所有含税价结果。

Excel写法(第三种let+lambda最常用公式,今天着重讲的部分):
比如要算“两个数各自平方+1之后的和”,比如第一行的:
(3^2+1)+(4^2+1)=10+17=27
就可以这样输入公式:

=LET(f,LAMBDA(x,x^2+1),f(A2:A4)+f(B2:B4))

把f定义为:LambdaA(x,x^2+1),
表达式是:f(A2:A4)+f(B2:B4)
即做一个相加的计算:
LambdaA(x,x^2+1)+LambdaA(x,x^2+1)
这时候A2:A4的值分别传入加号左边lambda中的x;B2:B4的值分别传入加号右边lambda中的x,计算完成后再相加。最后就得到了每行的“两个数的平方+1之后的和”。
其实数学写法Excel写法这两件事的思维方式一模一样:f是个规则,丢进去什么就按规则吐出来。课本里让你算f(a)、f(x+1) 那种代入练习,本质上就是在训练你现在写=f(A2)的那种直觉。
下面我们来讲一个 f(x) 的综合进阶案例,这也是之前发过的内容,再拿出来看看,帮助我们体会理解 f(x)。
数据源是这样的:
A2:E6是原始二维表:
行:品和颜色组合。
列:三个日期,分别是"1日"、"2日"、"3日"。
行列交叉位置数据:每个颜色的产品在对应日期的销量值。
G2:J14是我们想要得到的目标一维表:
列:品、颜色、日期、销量。
行:每个颜色的产品在每个日期都有单独一行一一对应的记录。
准备Let函数的变量名与变量值
首先使用If函数实现数组扩展:

=IF(C3:E6,C3:E6)

IF(条件数组, 返回值数组)

如果C3:E6区域的值为真值TRUE时(非0/非空值),会在返回数组对应位置返回C3:E6区域对应的值。返回数组的形状与C3:E6区域(较大区域)形状相同。

我们很容易会理解到
IF公式此时会返回C3:E6销量区域的原值,形成3列*4行的扩展数组。
接下来使用Tocol函数转换为单列:

=TOCOL(IF(C3:E6,C3:E6))

使上一步3列*4行的C3:E6销量区域的原值,转置为单列显示。

Tocol函数省略第2参数时,默认的转置方向为行优先顺序,即源数据第1行转置为单列后,继续第2行、第3行、最后是第4行,即一行一行的转换。

这种转换顺序完全符合我们二维表转一维表的理论基础。

用lambda函数将Tocol(IF(C3:E6,C3:E6))这一转换逻辑封装起来:

=LAMBDA(x, TOCOL(IF(C3:E6, x)))

lambda是一个自定义函数,接受一个参数x,返回TOCOL(IF(C3:E6, x))的结果。
Lambda函数的结构
x:输入参数(可以是单个值或数组)
TOCOL(IF(C3:E6, x)):函数体,对输入参数进行处理
这个函数的作用
将输入数组x根据C3:E6的条件实现“数组扩展”和“转换为单列”的两个动作。
这样let函数的变量名与变量值就确定了:

=LET(f,

     LAMBDA(x,TOCOL(IF(C3:E6,x))),

待定义的f参与的运算逻辑)

Let函数允许我们定义变量并在公式中重复使用:
第一个参数f:变量名
第二个参数LAMBDA(x,TOCOL(IF(C3:E6,x))):变量的值(一个Lambda函数)
第三个参数:使用变量f的计算表达式
Let函数创建了一个可复用的转换函数f,将Tocol+If这一转换逻辑封装起来,每次调用只需传入不同的参数。
品的数组扩展与单列转换
其实就是利用上面的lambda封装起来的逻辑。
如果C3:E6区域为非空(true),则返回A3:A6品区域的对应的值:

=IF(C3:E6,A3:A6)

转换为单列:

=TOCOL(IF(C3:E6,A3:A6))

放到let函数中,其实就是将A3:A6区域的数组扩展转单列逻辑赋予给f:

=LET(f,LAMBDA(x,TOCOL(IF(C3:E6,x))),f(A3:A6))

f(A3:A6)

即可将A3:A6品区域传递给lambda的变量x,执行If的数组扩展与Tocol的转单列。

颜色的扩展与单列转换
同理,如果C3:E6区域为非空(true),则返回B3:B6颜色区域的对应的值:
=IF(C3:E6,B3:B6)
转换为单列:

=TOCOL(IF(C3:E6,B3:B6))

放到let函数中其实就将B3:B6区域的扩展转单列逻辑赋予给f:

=LET(f,LAMBDA(x,TOCOL(IF(C3:E6,x))),HSTACK(f(A3:A6),f(B3:B6)))

f(B3:B6)

即可将B3:B6颜色区域传递给lambda的变量x,执行IF的数组扩展与TOCOL的单列转换。

HSTACK(f(A3:A6),f(B3:B6))

即与上一步品的展平数据进行横向的拼接,形成整体。

日期的扩展与单列转换
同理:

=LET(f,LAMBDA(x,TOCOL(IF(C3:E6,x))),HSTACK(f(A3:A6),f(B3:B6),f(C2:E2)))

f(C2:E2)

即可将C2:E2日期区域传递给lambda的变量x,执行IF的数组扩展与TOCOL的单列转换。

HSTACK(f(A3:A6),f(B3:B6),f(C2:E2))

即与上一步品与颜色的展平数据进行横向的拼接,形成整体。

销量的扩展与单列转换
同理:

=LET(f,LAMBDA(x,TOCOL(IF(C3:E6,x))),HSTACK(f(A3:A6),f(B3:B6),f(C2:E2),f(C3:E6)))

f(C3:E6)

即可将C3:E6销量区域传递给lambda的变量x,执行IF的数组扩展与TOCOL的单列转换。

HSTACK(f(A3:A6),f(B3:B6),f(C2:E2),f(C3:E6))

即与上一步品、颜色和日期的展平数据进行横向的拼接,形成整体。

LET公式的整体计算流程
定义函数 f
调用 f(A3:A6),计算一次 IF(C3:E6, A3:A6)和 TOCOL
调用 f(B3:B6),计算一次 IF(C3:E6, B3:B6)和 TOCOL
调用 f(C2:E2),计算一次 IF(C3:E6, C2:E2)和 TOCOL
调用 f(C3:E6),计算一次 IF(C3:E6, C3:E6)和 TOCOL
执行 Hstack横向拼接。
(构思以及撰写不易,如果觉得本文对提升自己有所感悟,希望能点一个“推荐”鼓励小编;如果您还有其它方面的问题,可后台消息框回复“提问”进行咨询)
学习Excel/你可以不常用/但不能不会用/如果你没有天赋/那就一直重复/当你快到本能反应的时候/你的重复就是别人眼中的天赋/冲破捆绑/展翅翱翔

map遍历scan遍历reduce迭代

pivotby降维byrow函数let函数

pivotby函数groupby函数

makearraymakearray

Excel视频大全①/Excel视频大全②

数据转换大全/Excel大全/正则大全