还在用&符号拼文本?还在写复杂的数组公式提取数据?这两个函数让你告别痛苦。
先吐槽一下过去的痛苦
场景1: 把A列所有人名用顿号连成一串
以前的做法:=A1&"、"&A2&"、"&A3...
数据一多,公式长到想砸电脑。
场景2: 提取满足条件的所有记录
以前的做法:INDEX+SMALL+IF数组公式
写一次,调试半天,下次用的时候忘了怎么写的。
TEXTJOIN:连接文本的神器
Office 2019/365才有,老版本的同学... 可以考虑升级了。
=TEXTJOIN(分隔符, 是否忽略空值, 要连接的文本1, 要连接的文本2, ...)
| 参数 | 说明 |
|---|---|
| 分隔符 | 用什么隔开,比如"、" ";" " " |
| 是否忽略空值 | TRUE/FALSE,建议TRUE |
| 文本 | 可以是单元格、区域、数组 |
基础用法
=TEXTJOIN("、", TRUE, A2:A10)
把A2:A10用"、"连起来,自动忽略空单元格。
结果:"张三、李四、王五、赵六..."
进阶用法:加前缀后缀
="参加人员:" & TEXTJOIN("、", TRUE, A2:A10) & "共" & COUNTA(A2:A10) & "人"
结果:"参加人员:张三、李四、王五共3人"
骚操作:每个单元格内容加引号
=TEXTJOIN(",", TRUE, CHAR(34)&A2:A10&CHAR(34))
CHAR(34)就是双引号,结果:
"张三","李四","王五"
直接可以复制到SQL的IN语句里用。
FILTER:提取数据的瑞士军刀
Excel 365专属,老版本可以用INDEX+SMALL+IF模拟。
=FILTER(要返回的区域, 条件, [如果没有匹配返回什么])
基础用法
提取"技术部"的所有员工:
=FILTER(A2:C10, B2:B10="技术部")
直接在单元格输入这个公式,符合条件的记录会自动溢出到下方单元格。
多条件提取
提取"技术部"且"工资>15000"的员工:
=FILTER(A2:C10, (B2:B10="技术部")*(C2:C10>15000))
条件之间用 * 表示AND,用 + 表示OR。
提取特定列
只要姓名和工资两列:
=FILTER(CHOOSE({1,3}, A2:A10, B2:B10, C2:C10), 条件)
或者用INDEX:
=FILTER(A2:A10, 条件) # 只取A列
组合拳:FILTER + TEXTJOIN
这才是今天的重头戏。
案例1:按部门列出所有员工(一行显示)
需求: D1单元格是部门名称,要在E1显示该部门所有员工,用顿号分隔。
=TEXTJOIN("、", TRUE, FILTER(B2:B100, C2:C100=D1))
原理:
- FILTER先筛选出符合条件的员工姓名(返回一个数组)
- TEXTJOIN把数组用顿号连起来
案例2:查找某人的所有项目
| 项目名 | 参与人员(多人在一单元格) |
|---|---|
| 项目A | 张三、李四 |
| 项目B | 李四、王五 |
| 项目C | 张三、王五 |
需求: 输入"张三",列出他参与的所有项目。
=TEXTJOIN("、", TRUE, FILTER(A2:A4, ISNUMBER(SEARCH("张三", B2:B4))))
解释:
SEARCH("张三", B2:B4)查找每个单元格是否包含"张三"ISNUMBER(...)把结果转成TRUE/FALSEFILTER筛选出包含"张三"的项目名TEXTJOIN连成一串
案例3:生成SQL的IN语句
假设A列是ID列表,要生成SQL的IN语句。
="IN (" & TEXTJOIN(",", TRUE, A2:A10) & ")"
如果是文本ID:
="IN (" & TEXTJOIN(",", TRUE, "'"&A2:A10&"'") & ")"
结果:IN ('A001','A002','A003')
案例4:动态邮件抄送列表
根据选择的部门,自动生成该部门所有人的邮箱。
=TEXTJOIN(";", TRUE, FILTER(D2:D100, B2:B100=下拉选择))
直接复制到邮件客户端的抄送栏。
溢出功能的小技巧
FILTER返回的结果会自动溢出到相邻单元格,这很方便,但有时候你想限制它。
只取前N条
=TAKE(FILTER(区域, 条件), 5)
只显示前5条(Excel 365新函数)。
或者用INDEX:
=INDEX(FILTER(区域, 条件), SEQUENCE(5))
兼容性处理
如果你用的是老版本Excel,FILTER可以用这个数组公式代替:
{=INDEX($B$2:$B$100, SMALL(IF($C$2:$C$100=$D$1, ROW($C$2:$C$100)-1), ROW(A1)))}
(需要Ctrl+Shift+Enter输入)
但是... 真的推荐升级,新函数香太多了。
一句话总结
FILTER负责找数据,TEXTJOIN负责连起来。找什么、怎么连,你说了算。
这对组合做报表、做清单、做邮件组,简直是效率神器。
TEXTJOIN一出,我就再也没用CONCATENATE了。FILTER一出,复杂的INDEX+SMALL+IF组合直接吃灰。微软这些年总算干了点人事。