课程
从 Excel 数据生成格式良好的文本是常见需求,但把数值一个个拼接起来往往会变得凌乱。Excel 的 TEXTJOIN() 函数提供了直接明了的解决方案,允许您使用分隔符合并成片的文本,甚至可以跳过空单元格。
本文将带您了解 TEXTJOIN() 的基础,看看它与 CONCAT() 和 CONCATENATE() 等类似函数的差异,并通过实用场景展示它的优势。在此过程中,我会为 TEXTJOIN() 站台,因为我认为它如今已是合并文本的更优工具,我也相信看完文章您会赞同这一点。
Excel TEXTJOIN() 的工作原理
先弄清楚 TEXTJOIN() 到底做什么,以及为什么它的语法比以往灵活得多。
核心上,TEXTJOIN() 可将多个单元格的文本值连接起来,并在其间插入一个分隔符(如逗号、空格或分号)。与旧方法不同,它能一次处理整个区域,而且您可以决定是否忽略空白。
其语法如下:
=TEXTJOIN(delimiter, ignore_empty, text1, [text2], ...)
-
delimiter:您希望在每段文本之间放置的字符(通常为逗号、空格等) -
ignore_empty:为 TRUE 时跳过空白单元格,为 FALSE 时包含空白 -
text1, [text2], …:要合并的单元格、区域或值
例如,假设您在 A1、A2 和 A3 中有值。您想用逗号分隔并跳过空白:
=TEXTJOIN(",", TRUE, A1:C1)

如果 A2 为空,您将只得到 A1 和 A3 的值,并以逗号分隔。
这为什么重要?其他函数(我指的是 CONCATENATE())需要您逐个列出单元格,而且不会跳过空白。TEXTJOIN() 更省力、更易维护。
TEXTJOIN() vs. CONCATENATE() vs. CONCAT()
既然已了解 TEXTJOIN() 的基础,也值得直接与旧的文本函数对比。如果您用过 CONCATENATE() 或 CONCAT(),可能会想为什么要切换。
-
TEXTJOIN():可指定分隔符并轻松跳过空白。接受区域。 -
CONCAT():可连接区域或单个文本单元格,但无法指定分隔符,也不会跳过空白。 -
CONCATENATE():最古老的选项。必须逐个指定单元格。无分隔符参数,不支持区域。
例如,让我们用分号连接 B1、B2 和 B3 的值。不同函数如下所示:
=TEXTJOIN(";", TRUE, A1:C1)

=CONCAT(B1:D1)

=CONCATENATE(B1, C1, D1)

请注意,只有 TEXTJOIN() 可直接选择分隔符而无需额外处理。使用 CONCAT() 或 CONCATENATE(),如果需要分隔符,您必须手动添加:
=B1 & ";" & C1 & ";" & D1

此外,并且同样重要的是,根据数据结构不同,如果某个单元格为空,TEXTJOIN() 可以为您跳过它。CONCATENATE() 和 CONCAT() 则会把空白也算进去。
处理分隔符与空白单元格
让我再多谈谈这两个常见痛点:添加一致的分隔符,以及忽略空白单元格。
自定义分隔符
在不同场景下您可能需要不同的分隔符。您可能会用逗号、竖线、换行,甚至其他字符作为分隔。
若要使用竖线连接,使用如下公式:
=TEXTJOIN("|", TRUE, D1:G1)

您也可以做更小众的处理。这里,我使用了“空格-连字符-空格”作为分隔符:
=TEXTJOIN(" - ", TRUE, D1:G1)

您甚至可以使用 CHAR(10) 来实现换行,不过需要在单元格格式中打开自动换行(Wrap Text)才能看到效果。
跳过空白
数据拼接中最令人头疼的事情之一就是处理空白。TEXTJOIN() 让您掌控此事。将 ignore_empty 参数设为 TRUE,空白将被完全忽略。
=TEXTJOIN(", ", TRUE, E1:G1)

结果:“Red, Blue”。空单元格(F2)被忽略,因此不会出现多余的逗号。
如果将 ignore_empty 设为 FALSE:
=TEXTJOIN(", ", FALSE, E1:G1)

现在结果是:“Red, , Blue”。那个多余的逗号很显眼(通常不是您想要的)。以我的经验,TRUE 通常更合适。
这些看似细微的差别,如果您多练习这个函数,能省下不少后期清理的时间。
构建动态列表与标签
了解了基础后,让我们看看 TEXTJOIN() 如何解决问题。我将聚焦两个您可能会遇到的场景:创建动态汇总和从可变数据组装标签。
基于用户输入创建汇总
假设您在收集一组可选问题的问卷反馈,用户以 Yes/No 作答。只有部分问题会被回答,因此结果分散在 F1 到 J1。
如果您只想列出回答了“Yes”的问题,可以将 TEXTJOIN() 与 IF() 和 FILTER()(在新版 Excel 中的动态数组)结合使用。
假设 G1:G5 存放问题文本,F1:F5 存放对应的 Yes/No:
=TEXTJOIN(", ", TRUE, FILTER(F2:J2, F1:J1="Yes"))

现在,您的输出单元格只会列出用户回答“Yes”的问题,并以逗号分隔。
如果您没有动态数组功能,可以建立一个辅助列:仅当答案为 Yes 时输出问题文本,然后再用 TEXTJOIN() 连接该辅助区域。
从可变数据构建自定义标签
设想您要从一张表中生成邮寄标签,而其中某些字段(如“Apartment”或“Suite”)有时为空。您希望将地址组件合并为单行。
如果地址位于 H1(“123 Main St”)、H2(“Apt 4B”或空)、H3(“Springfield”)、H4(“IL”)、H5(“62704”),您可以这样写:
=TEXTJOIN(", ", TRUE, H1:L1)

如果 H2 为空,输出依然整洁(不会出现双逗号!),因为 TEXTJOIN() 会跳过空单元格。
这些是常见示例,但同样的逻辑适用于任何需要按条件合并可选字段的数据。
其他需要注意的事项
尽管 TEXTJOIN() 很方便,仍有一些小点需要注意:
在 TEXTJOIN() 中使用多个区域
关于 TEXTJOIN() 如何处理多个区域,有一点需要了解。即使区域彼此不相邻,您可以传入多个区域,只要分别列出它们即可:
=TEXTJOIN(", ", TRUE, B1:D1, B2:D2)

这样完全可行。Excel 会合并两个区域的值并将其连接。只要记住:您不能把它们写成一个数组如 (A1:A3,C1:C3)。需要将每个区域作为独立参数列出。
嵌套函数与动态数组
如果您在动态数组公式中使用 TEXTJOIN()(如搭配 UNIQUE() 或 FILTER()),请记住分隔符与 ignore_empty 参数仍应为单一值。在这些位置使用数组将返回 #VALUE! 错误。
分隔符与最终格式
有时,您不需要分隔符(只想把文本直接拼在一起)。将分隔符设为 ""(即空字符串):
=TEXTJOIN("", TRUE, A1:C1)

但请注意:如果不使用分隔符,您就丧失了它相较 CONCAT() 的主要优势。
如果您要创建供 Excel 外部使用的列表(如 CSV 上传),请留意多余空格、意外换行或字符编码问题(尤其在使用符号或 Unicode 时)。
相关函数与进阶技巧
当您熟悉 TEXTJOIN() 后,可能会想它与其他“动态”Excel 函数如何配合。通常,将其与 UNIQUE()、FILTER() 或 SORT() 结合会更强大。
例如,假设您想把列表中所有唯一的产品类别连接起来:
=TEXTJOIN(", ", TRUE, UNIQUE(TRANSPOSE(A1:E1)))

注意:UNIQUE() 在 Excel 中默认面向列。因为我在处理行,需要同时使用 TRANSPOSE()。
或者,您只想要满足某个条件的值:
=TEXTJOIN(", ", TRUE, FILTER(A1:C1, A2:C2="Active"))

这两个示例展示了 TEXTJOIN() 如何在无需辅助列或手动筛选的情况下进行数据汇总或报告。
结语
如果您仍在使用 CONCATENATE() 或手动拼接单元格,切换到 TEXTJOIN() 将为您节省时间。(我保证!)
另外,我想补充一点,学习 TEXTJOIN() 会让您习惯用“区域”的思维。这种思维在使用 Excel 的动态数组函数及其他更现代的方法时会大有裨益。继续学习可参加我们的 Advanced Excel Functions 课程。

我是数据科学编辑,曾为科学期刊发表的研究论文撰稿。我的兴趣领域包括线性代数、统计学、R 等相关主题。