Excel 函数式编程相关的公式

目录

  • [一. 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的倍数)

一. 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单元格中有如下内容,现在要求对该内容进行如下操作

  1. 拆分
  2. 去重
  3. 排序
  4. 再拼接
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)
)
相关推荐
开开心心_Every1 天前
进程启动瞬间暂停工具,适合调试多开
运维·服务器·gitee·pdf·开源·电脑·excel
葡萄城技术团队1 天前
表格工具栏:像 Excel 只是起点,按需定制才是关键
excel
开开心心就好1 天前
直接减少蓝光辐射的专业护眼工具
linux·运维·服务器·智能手机·excel·java-rabbitmq·sdkman
得闲喝茶2 天前
SQL处理数据的常用语法语句
数据库·笔记·sql·数据分析·excel
hmywillstronger2 天前
【Python】从SAP2000 XML截面库提取数据到Excel
xml·python·excel
抹茶咖啡2 天前
IT运维的365天--045 WPS突然就不能正常打开Excel文件了
excel·it运维·wps
专注VB编程开发20年2 天前
在 Python 中使用 comtypes 时,大小写通常必须保持精确
python·excel
E_ICEBLUE3 天前
如何提取 Word 文档中的表格并导出为 Excel(Python 教程)
python·word·excel