目录
- [一. LET函数](#一. LET函数)
-
- [1.1 简介](#1.1 简介)
- [1.2 基本用法](#1.2 基本用法)
- [1.3 实战](#1.3 实战)
-
- [1.3.1 案例1](#1.3.1 案例1)
- [1.3.2 案例2](#1.3.2 案例2)
- [二. LAMBDA函数](#二. LAMBDA函数)
-
- [2.1 简介](#2.1 简介)
- [2.2 基本用法](#2.2 基本用法)
- [2.3 共享自定义公式给其他用户](#2.3 共享自定义公式给其他用户)
- [2.4 实战](#2.4 实战)
-
- [2.4.1 LAMBDA 配合 LET 使用](#2.4.1 LAMBDA 配合 LET 使用)
- [2.4.2 字符串处理](#2.4.2 字符串处理)
- [三. MAP函数](#三. MAP函数)
-
- [3.1 简介](#3.1 简介)
- [3.2 基本用法](#3.2 基本用法)
- [3.3 MAP 和 BYROW 的区别](#3.3 MAP 和 BYROW 的区别)
- [四. FILTER](#四. FILTER)
-
- [4.1 简介](#4.1 简介)
- [4.2 根据多条件进行筛选](#4.2 根据多条件进行筛选)
- [4.3 实战](#4.3 实战)
-
- [4.3.1 `FILTER` 配合 `LET` 使用](#4.3.1
FILTER配合LET使用) - [4.3.2 模糊包含](#4.3.2 模糊包含)
- [4.3.3 过滤出5的倍数](#4.3.3 过滤出5的倍数)
- [4.3.1 `FILTER` 配合 `LET` 使用](#4.3.1
一. LET函数
1.1 简介
🔷在 LET 出现之前,Excel 很多复杂公式都会:
- 重复计算
- 很难读
- 很难维护
- 性能差
🔷而 LET 可以像编程语言一样:
- 定义变量
- 给变量命名
- 重复使用中间结果
- 让公式更清晰
🔷当有下面的情况发生的时候,应该考虑使用LET:
- 一个表达式重复出现
- 公式太长,看不懂
- 想提高性能
- 有多个中间步骤
🔷LET 的基本语法
java
=LET(
变量名1, 值1,
变量名2, 值2,
...
最终返回值
)
1.2 基本用法
🔷定义变量
- 使用let之前,
A1+B1被计算了2次
java
=(A1+B1)*2 + (A1+B1)*3
- 使用let之后,
A1+B1的计算结果被放到了x变量中,A1+B1只需要计算1次就可以了。
java
=LET(
x, A1+B1,
x*2 + x*3
)
🔷中间结果调试
- 下面是想要得到的效果,最后想要获取y的值
java
=LET(
x, A1+A2,
y, x*2,
y
)
- 可以先将终将变量x先输出,得到中间定义变量的值,便于debug
java
=LET(
x, A1+A2,
y, x*2,
x
)
1.3 实战
1.3.1 案例1
🔷假设A1单元格中有如下内容,现在要求对该内容进行如下操作
- 拆分
- 去重
- 排序
- 再拼接
bash
apple,banana,apple,orange,banana
🔷不使用LET的话,可读性较差
java
=TEXTJOIN(
",",
TRUE,
SORT(
UNIQUE(
TEXTSPLIT(A1,",")
)
)
)
🔷使用了LET之后,可读性更高
java
=LET(
arr, TEXTSPLIT(A1,","),
uniqueArr, UNIQUE(arr),
sortedArr, SORT(uniqueArr),
TEXTJOIN(",",TRUE,sortedArr)
)
1.3.2 案例2
java
=LET(
name, TEXTBEFORE(A2:A3,","),
scores, --TEXTSPLIT(TEXTAFTER(A2:A3,","),","),
total, BYROW(scores,LAMBDA(r,SUM(r))),
avg, BYROW(scores,LAMBDA(r,AVERAGE(r))),
id, SEQUENCE(ROWS(name)),
VSTACK(
{"序号","姓名","总分","平均分"},
HSTACK(id,name,total,avg)
)
)

二. LAMBDA函数
2.1 简介
🔷基本语法结构
java
=LAMBDA(参数1, 参数2, ..., 计算公式)
🔷LAMBDA相当于其他编程语言中的匿名函数,核心作用是在 Excel 中自定义函数。
需要注意的是LAMBDA本身本身不会执行,必须要被调用之后才会执行。
- 只是定义了一个
LAMBDA函数,并没有调用,显示计算错误

- 定义了
LAMBDA函数,并且调用

LAMBDA函数支持多个参数

2.2 基本用法
🔷LAMBDA函数的最重要的点就是:把复杂公式封装起来
java
=LAMBDA(score,
IF(score>=90,"A",
IF(score>=80,"B",
IF(score>=60,"C","D")
)
)
)
- 【公式】选项卡,找到【名称管理器】
- 然后就将自定义的
LAMBDA函数粘贴到【引用位置】处 - 最后再给
LAMBDA函数取一个名字,就完成了自定义函数的构建

- 然后就可以使用自定义函数了

2.3 共享自定义公式给其他用户
🔷使用LAMBDA函数自定义的公式,只会在当前Excel中起作用。
如果同时定义了很多自定义函数,其他人想要使用很多自定义函数的话,就要手动一个个导入,很耗费时间。
🧐解决办法
-
新建一个Excel文件,然后通过【名称管理器】定义若干个自定义函数
-
将Excel文件另存为
.xlam格式,将该文件共享给其他用户 -
其他用户将
.xlam格式的文件存放到C:\Users\用户名\AppData\Roaming\Microsoft\AddIns文件夹中 -
然后如下图所示,通过Excel的【加载项】找到对应的
.xlam文件名,然后激活即可

-
激活之后,当前用户的所有的Excel就都可以使用自定义的公式了
2.4 实战
2.4.1 LAMBDA 配合 LET 使用
🔷语法规则
java
=LAMBDA(参数,
LET(
变量1,值1,
变量2,值2,
...
最终返回值
)
)
🔷根据成绩,计算该成绩对应的等级
java
// ▶版本1
=LAMBDA(score,
LET(
grade,
CHOOSE(
1+(score>=60)+(score>=80)+(score>=90),
"D","C","B","A"
),
grade
)
)
// ▶版本2
=LAMBDA(score,
LET(
isA,score>=90,
isB,score>=80,
isC,score>=60,
grade,
CHOOSE(
1+isC+isB+isA,
"D","C","B","A"
),
grade
)
)
🔷计算添加消费税和折扣之后的商品价格的函数
java
=LAMBDA(price,tax,
LET(
subtotal,price*tax,
discount,subtotal*0.9,
ROUND(discount,2)
)
)
2.4.2 字符串处理
- 假设
text的内容为:banana, apple,apple,orange - 被
LAMBDA处理之后就会变为:apple,banana,orange
java
=LAMBDA(text,
LET(
arr,TEXTSPLIT(text,","),
clean,TRIM(arr),
uniqueArr,UNIQUE(clean),
sortedArr,SORT(uniqueArr),
TEXTJOIN(",",TRUE,sortedArr)
)
)
三. MAP函数
3.1 简介
🔷MAP函数是Excel新增的动态数组函数之一,主要用来对数组中的每个元素执行一次自定义计算,和下面语言的map用法有点像:
- JavaScript 的
Array.map() - Python 的
map() - Java Stream 的
map - PowerShell 的
ForEach-Object
🔷Excel的MAP函数通常会搭配下面的函数一起使用
- LAMBDA
- LET
- BYROW
- BYCOL
🔷基本语法
array1: 第一个数组array2: 第二个数组(可选)LAMBDA: 对每个元素执行的逻辑a,b:对应数组中的当前元素
java
=MAP(array1,[array2],...,LAMBDA(a,b,...,计算逻辑))
3.2 基本用法
- A1到B5单元格区域内的每个单元格的数据都乘2
java
=MAP(A1:B5,LAMBDA(x,x*2))

🔷MAP还支持多个数组一起处理
- 两个数组相加
java
=MAP(A1:A5,B1:B5,LAMBDA(a,b,a+b))

3.3 MAP 和 BYROW 的区别
- MAP是逐元素处理,会对所指定区域内的每一个单元格都进行处理。
java
=MAP(A1:C3,LAMBDA(x,x*2))

- BYROW逐行处理,会对指定区域内的每一整行都进行处理。
java
=BYROW(A1:C3,LAMBDA(r,SUM(r)))

四. FILTER
4.1 简介
🔷FILTER函数的作用是:根据条件,从数据区域中筛选出符合条件的数据。
array:要筛选的数据区域include:筛选条件(TRUE/FALSE)[if_empty]:没有结果时返回什么
java
=FILTER(array, include, [if_empty])
- 筛选出分数 >= 90 的人
=FILTER(A2:B5,B2:B5>=90)

4.2 根据多条件进行筛选
🔷* 代表 和
- 分数 >=90 且 姓名是李四
=FILTER(A2:B5,(B2:B5>=90)*(A2:A5="李四"))

🔷+代表 或
- 分数 >=90 或 分数 <=60
=FILTER(A2:B5,(B2:B5>=90)+(B2:B5<=60))

🔷当没有符合条件的数据时,会报错,因此一般建议添加第三个参数

4.3 实战
4.3.1 FILTER 配合 LET 使用
FILTER配合LET使用,可以提高公式的可读性- 避免重复计算
- 性能更好
java
=LET(
data,A2:B5,
score,B2:B5,
FILTER(data,score>=90)
)

4.3.2 模糊包含
🔷查找包含 東 的数据
SEARCH找位置ISNUMBER判断是否找到
java
=LET(
data,A1:A4,
FILTER(
data,
ISNUMBER(SEARCH("東",data))
)
)

4.3.3 过滤出5的倍数
java
=LET(
data,A1:A6,
FILTER(data,MOD(data,5)=0)
)
