Excel 函数式编程相关的公式
2026/5/13 19:14:00 网站建设 项目流程

目录

  • 一. LET函数
    • 1.1 简介
    • 1.2 基本用法
    • 1.3 实战
      • 1.3.1 案例1
      • 1.3.2 案例2
  • 二. LAMBDA函数
    • 2.1 简介
    • 2.2 基本用法
    • 2.3 共享自定义公式给其他用户
    • 2.4 实战
      • 2.4.1 LAMBDA 配合 LET 使用
      • 2.4.2 字符串处理
  • 三. MAP函数
    • 3.1 简介
    • 3.2 基本用法
    • 3.3 MAP 和 BYROW 的区别
  • 四. FILTER
    • 4.1 简介
    • 4.2 根据多条件进行筛选
    • 4.3 实战
      • 4.3.1 `FILTER` 配合 `LET` 使用
      • 4.3.2 模糊包含
      • 4.3.3 过滤出5的倍数

一. LET函数

1.1 简介

🔷在 LET 出现之前,Excel 很多复杂公式都会:

  • 重复计算
  • 很难读
  • 很难维护
  • 性能差

🔷而 LET 可以像编程语言一样:

  • 定义变量
  • 给变量命名
  • 重复使用中间结果
  • 让公式更清晰

🔷当有下面的情况发生的时候,应该考虑使用LET:

  • 一个表达式重复出现
  • 公式太长,看不懂
  • 想提高性能
  • 有多个中间步骤

🔷LET 的基本语法

=LET(变量名1,1,变量名2,2,...最终返回值)

1.2 基本用法

🔷定义变量

  • 使用let之前,A1+B1被计算了2次
=(A1+B1)*2+(A1+B1)*3
  • 使用let之后,A1+B1的计算结果被放到了x变量中,A1+B1只需要计算1次就可以了。
=LET(x,A1+B1,x*2+x*3)

🔷中间结果调试

  • 下面是想要得到的效果,最后想要获取y的值
=LET(x,A1+A2,y,x*2,y)
  • 可以先将终将变量x先输出,得到中间定义变量的值,便于debug
=LET(x,A1+A2,y,x*2,x)

1.3 实战

1.3.1 案例1

🔷假设A1单元格中有如下内容,现在要求对该内容进行如下操作

  1. 拆分
  2. 去重
  3. 排序
  4. 再拼接
apple,banana,apple,orange,banana

🔷不使用LET的话,可读性较差

=TEXTJOIN(",",TRUE,SORT(UNIQUE(TEXTSPLIT(A1,","))))

🔷使用了LET之后,可读性更高

=LET(arr,TEXTSPLIT(A1,","),uniqueArr,UNIQUE(arr),sortedArr,SORT(uniqueArr),TEXTJOIN(",",TRUE,sortedArr))

1.3.2 案例2

=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 简介

🔷基本语法结构

=LAMBDA(参数1,参数2,...,计算公式)

🔷LAMBDA相当于其他编程语言中的匿名函数,核心作用是在 Excel 中自定义函数。
需要注意的是LAMBDA本身本身不会执行,必须要被调用之后才会执行。

  • 只是定义了一个LAMBDA函数,并没有调用,显示计算错误

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

  • LAMBDA函数支持多个参数

2.2 基本用法

🔷LAMBDA函数的最重要的点就是:把复杂公式封装起来

=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 使用

🔷语法规则

=LAMBDA(参数,LET(变量1,1,变量2,2,...最终返回值))

🔷根据成绩,计算该成绩对应的等级

// ▶版本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))

🔷计算添加消费税和折扣之后的商品价格的函数

=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
=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:对应数组中的当前元素
=MAP(array1,[array2],...,LAMBDA(a,b,...,计算逻辑))

3.2 基本用法

  • A1到B5单元格区域内的每个单元格的数据都乘2
=MAP(A1:B5,LAMBDA(x,x*2))

🔷MAP还支持多个数组一起处理

  • 两个数组相加
=MAP(A1:A5,B1:B5,LAMBDA(a,b,a+b))

3.3 MAP 和 BYROW 的区别

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

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


四. FILTER

4.1 简介

🔷FILTER函数的作用是:根据条件,从数据区域中筛选出符合条件的数据。

  • array:要筛选的数据区域
  • include:筛选条件(TRUE/FALSE)
  • [if_empty]:没有结果时返回什么
=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.1FILTER配合LET使用

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

4.3.2 模糊包含

🔷查找包含的数据

  • SEARCH找位置
  • ISNUMBER判断是否找到
=LET(data,A1:A4,FILTER(data,ISNUMBER(SEARCH("東",data))))

4.3.3 过滤出5的倍数

=LET(data,A1:A6,FILTER(data,MOD(data,5)=0))

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询