根据您的 Excel 版本,您会有不同的选择。
选项 1:TEXTJOIN
我认为您正在寻找TEXTJOIN 函数。请记住,您只能在更高版本的 Excel 中使用它(请参阅文档链接),它可以像这样工作:
B1中的公式:
=TEXTJOIN(",",TRUE,LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")))
注意: 这是一个数组公式,您需要使用 CtrlShiftEnter 输入
为了让您不需要使用上述组合键,我们可以添加一个INDEX:
=TEXTJOIN(",",TRUE,INDEX(LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")),))
其他信息:
FILTERXML
这个函数需要(根据文档)两个必需的参数:
因为我们想从单元格中返回一个元素(单词)数组,我们需要 SUBSTITUTE 结束标签 (</..>) 的空格并将其与开始标签 (<..>) 连接起来字符串的开头和结尾的另一个结束标记。
我将不得不依靠标签上的XML 解释来解释为什么<?><?> 起作用及其含义,因为就我的测试而言,我可以交换字母或用另一个相同的字母替换只要最终的Xpath 与相同的字符相似,就会得到结果。如果有人能够对这个问题提供更好的解释来补充这个答案,那就太好了。
更多FILTERXML“技巧”,请看here
TEXTJOIN
如果您是 Office 365 订阅者或拥有 Excel 2019,则可以使用此功能。有(根据文档)至少 3 个必需的参数:
- 必须是文本字符串的分隔符,可以是空的,也可以是一个或多个用双引号括起来的字符,或者是对有效文本字符串的引用。如果提供了一个数字,它将被视为文本。
- 第二个参数可以包含
TRUE 或FALSE,并确定是否要排除/包含空值
- 第三个参数是要连接的文本项。文本字符串或字符串数组,例如单元格区域。
现在我们可以将这两个函数连接在一起,FILTERXML 返回一个数组,我们可以在TEXTJOIN 中使用该数组。
INDEX + LEN
我将不得不一起解释这些函数的用法。我不认为LEN 和INDEX 需要单独介绍太多,但它们一起工作得很好。原生会有一种称为隐式交集的力,当您将值数组传递给函数时,它会阻止LEN 返回值数组,在本例中是通过我们的FILTERXML。
通常,您可以使用以下组合键禁用此机制:CtrlShiftEnter,更广为人知的是CSE。
现在INDEX 所做的是禁用此隐式交集,使LEN 能够返回一个数组,从而无需CSE 公式。 INDEX 是具有这种“权力”的功能之一。关于隐式交集的更深入的解释可以找到here
选项 2:UDF
如果无法访问TEXTJOIN,我认为您需要看看如何使用 UDF,可能如下所示:
Function TEXTJOIN(rng As Range) As String
TEXTJOIN = Join(Application.Evaluate("LEN({""" & Join(Split(rng, " "), """,""") & """})"), ",")
End Function
您可以在B1 中调用它,如下所示:=TEXTJOIN(A1)
其他信息:
UDF 由三个协同工作的主要机制组成:
JOIN
这个函数有两个参数,其中第一个是必需的:
- 第一个参数是一个包含子字符串的一维数组
- 第二个(可选)参数是一个字符串字符,用于分隔返回字符串中的子字符串。如果省略,则使用空格字符 (" ")。如果 delimiter 是一个长度为零的字符串 (""),则列表中的所有项目都连接起来,没有分隔符。
函数返回一个字符串值
SPLIT
此函数接受一个字符串并用指定的字符/子字符串对其进行分隔。它采用以下参数:
- 1st:包含子字符串和分隔符的必需字符串表达式。如果表达式是零长度字符串(""),则Split返回一个空数组,即一个没有元素也没有数据的数组。
- 2nd:可选的分隔符,它是用于标识子字符串限制的字符串字符。如果省略,则假定空格字符 (" ") 是分隔符。如果 delimiter 是长度为零的字符串,则返回包含整个表达式字符串的单元素数组。
- 3rd:可选限制,要返回的子串数量; -1 表示返回所有子字符串。
- 4th:Compare,也是可选的,是一个数值,表示在评估子字符串时要使用的比较类型。有关值,请参阅设置部分。
在这种情况下,我们只需要前两个参数。
Application.Evaluate
这是 IMO 最方便的机制之一,您可以使用它来提取返回的值数组,而无需遍历项目/单元格。当你为函数提供一个大数组公式时,它可能会变慢,但在这种情况下它会很好。该函数将 Microsoft Excel 名称转换为对象或值,当我们将公式传递给它时,它将返回结果。在这种特殊情况下,它将返回一个数组。