excel - 有没有一种方法可以计算字符串中每个单词的字符数,并返回以逗号分隔的值?

标签 excel vba excel-formula word-count charactercount

我在单元格中有一个字符串列表-其中有1000个-并且我需要计算每个单词的字符但要用单词分开-最好以1个快速公式...

例如:
1.“带手柄黑杯”>我需要的公式> 5,3,4,6


“大熊雕像”>我需要的公式> 5,4,6


对于重复执行的任务,我需要这样做,该任务以一种非常低效的方式进行了宏处理,无法将单词计数到列中(对于这种情况,我们最多需要使用20个单词),但这需要解决。

通常,我们计算空格和嵌套的serach()公式的层数,以piggy带到另一个上以破坏结构,然后字符对各个单词进行计数...

我可以选择使用宏来替换逗号和将文本替换为列的空格,但这仍然使我需要长时间的计数过程

我们显然使用=LEN(A1)-LEN(SUBSTITUTE(A1," ",""))来计算单词中的空格

然后,我们目前将=SEACRH()函数与=MID()函数(以及一些奇异的数字)结合使用,以将每个单词显示在其自己的单个单元格中

然后=LEN再次对所有单个词进行处理-非常long

我希望找到一种更短的方法来执行此操作,但是我觉得仅凭公式可能没有足够动态的方法来执行此操作,希望有人可以证明我做错了!

最佳答案

根据Excel版本,您将有不同的选择。



选项1:TEXTJOIN

我认为您正在寻找TEXTJOIN函数。只需记住,您只能在更高版本的Excel中使用它(请参阅文档链接),它可以像这样工作:

enter image description here

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

此函数(根据文档)采用两个必需的参数:


有效XML中的字符串
有效XPath中的字符串


因为我们要从单元格返回元素(单词)的数组,所以我们需要SUBSTITUTE结束标记(</..>)的空格,并在开始处将其与开始标记(<..>)连接起来字符串和结尾处的另一个结束标记。

我必须依靠标签上的XML解释<?><?>的工作原理及其含义,因为就我的测试而言,我可以交换字母或将其替换为效果相同的另一个字母因为最后一个Xpath类似于相同的字符。如果有人能够用对此问题的更好解释来补充这个答案,那就太好了。

有关更多FILTERXML“技巧”,请查看here



TEXTJOIN

如果您是Office 365订阅者或自己的Excel 2019,则可以使用此功能。根据文档,至少有3个必需参数:


分隔符,必须是文本字符串,可以为空,也可以是一个或多个用双引号引起来的字符,或者是对有效文本字符串的引用。如果提供了数字,它将被视为文本。
第二个参数可以包含TRUEFALSE,并确定是否要排除/包括空值
第三个参数是要连接的文本项。文本字符串或字符串数​​组,例如一系列单元格。


现在,在这里我们可以将两个函数结合在一起,FILTERXML返回一个数组,我们可以在TEXTJOIN中使用该数组。



INDEX + LEN

我将不得不一起解释这些功能的用法。我认为LENINDEX本身不需要太多介绍,但是它们在一起可以很好地工作。在本地,将有一种称为隐式交集的作用力,当将值数组传递给函数时(本例中是通过我们的LEN),它将防止FILTERXML返回值数组。

通常,您可以使用以下组合键禁用此机制:CtrlShiftEnter,通常称为CSE

现在,INDEX的功能是禁用此隐式交集,从而使LEN能够返回数组,从而无需使用CSE公式。 INDEX是具有此“功能”的功能之一。可以找到关于隐式交点的更深入的解释



选项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由三个相互配合的主要机制组成:

here

此功能具有两个参数,其中第一个是必需的:


第一个参数是包含子字符串的一维数组
第二个(可选)参数是一个字符串字符,用于分隔返回的字符串中的子字符串。如果省略,则使用空格字符(“”)。如果定界符是零长度的字符串(“”),则列表中的所有项目都将没有定界符连接在一起。


该函数返回一个字符串值



JOIN

此函数采用字符串,并用指定的字符/子字符串定界。它采用以下参数:


1st:必需的字符串表达式,包含子字符串和定界符。如果expression是长度为零的字符串(“”),则Split返回一个空数组,即没有元素和数据的数组。
2nd:可选的定界符,它是一个字符串字符,用于标识子字符串限制。如果省略,则假定空格字符(“”)为定界符。如果定界符是零长度的字符串,则返回包含整个表达式字符串的单元素数组。
第三:可选限制,要返回的子字符串数; -1表示返回所有子字符串。
第四:比较(也是可选的)是一个数字值,指示评估子字符串时要使用的比较类型。有关值,请参见“设置”部分。


在这种情况下,我们只需要前两个参数。



SPLIT

这是IMO上最方便的机制之一,可用于提取返回的值数组而不必遍历项目/单元格。当您向函数提供大数组公式时,它可能变慢,但是在这种情况下就可以了。该功能将Microsoft Excel名称转换为对象或值,当我们将其传递给公式时,它将返回结果。在这种情况下,它将返回一个数组。

关于excel - 有没有一种方法可以计算字符串中每个单词的字符数,并返回以逗号分隔的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58673369/

相关文章:

excel - 使用 VBA 循环遍历范围时查找精确的字符串

vba - Excel公式单元格基于背景颜色

excel - 将数组传输到文本文件的最快方法

vba - 子例程将无法编译

vba - 更改美国占德国百分比的百分比

excel - 我想根据每行的起始值找出 MS Excel 中的标题名称

excel - 提取列唯一ID对应的两个最小值

excel - 使用 VBA for Excel 从大范围单元格中删除 'extra' 空格(超过 1 个)的更快方法

vba - 如何为一张纸设置vba代码?

Excel 多个 IF/AND/OR 条件