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)
)
相关推荐
E-iceblue2 天前
Excel 列转行/行列转换全指南:从 4 种常见解法到 Python 批量自动化
python·excel·python库·spire.xls
Data-Miner3 天前
AI处理数据的脚本复用与逻辑复用有什么区别?哪种方式更能沉淀工作成果
数据分析·excel
福兮说3 天前
在浏览器里写一个“够用就好“的 Excel 公式求值器
前端·javascript·excel·编译原理
慧都小妮子3 天前
标签打印如何减少手工抄数?用Bartender 直连 Excel 批量打印
excel·bartender·条码打印·标签打印软件·数据驱动打印·工业打印机
SunnyDays10114 天前
Java 设置 Excel 数据验证:整数、日期、文本长度、下拉列表和时间
java·excel·数据验证·下拉列表
Metaphor6924 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
用户0332126663674 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
企业数字化笔记4 天前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel
CORNERSTONE3655 天前
低代码开发有哪些应用场景?
低代码·excel·erp·mes·企业数字化
小葱炖豆腐5 天前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib