TEXTJOIN + FILTER:文本处理的黄金搭档

TEXTJOIN + FILTER:文本处理的黄金搭档

 次点击
18 分钟阅读

还在用&符号拼文本?还在写复杂的数组公式提取数据?这两个函数让你告别痛苦。


先吐槽一下过去的痛苦

场景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))

原理:

  1. FILTER先筛选出符合条件的员工姓名(返回一个数组)
  2. TEXTJOIN把数组用顿号连起来

案例2:查找某人的所有项目

项目名 参与人员(多人在一单元格)
项目A 张三、李四
项目B 李四、王五
项目C 张三、王五

需求: 输入"张三",列出他参与的所有项目。

=TEXTJOIN("、", TRUE, FILTER(A2:A4, ISNUMBER(SEARCH("张三", B2:B4))))

解释:

  • SEARCH("张三", B2:B4) 查找每个单元格是否包含"张三"
  • ISNUMBER(...) 把结果转成TRUE/FALSE
  • FILTER 筛选出包含"张三"的项目名
  • 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组合直接吃灰。微软这些年总算干了点人事。

© 本文著作权归作者所有,未经许可不得转载使用。