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

时间:2019-11-02 17:11:59

标签: excel vba excel-formula word-count charactercount

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

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

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

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

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

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

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

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

然后=LEN再次遍历所有单个单词-long之以鼻

我希望找到一种更短的方法来做到这一点,但是感觉可能没有足够的动态方法来单独使用公式来完成,希望有人可以证明我做错了!

3 个答案:

答案 0 :(得分:4)

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


选项1:TEXTJOIN

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

enter image description here

B1中的公式:

=TEXTJOIN(",",TRUE,LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")))
  

注意: 这是一个数组公式,您需要使用 Ctrl Shift < kbd>输入

为了使其不再需要使用上面的组合键,我们可以添加一个INDEX

=TEXTJOIN(",",TRUE,INDEX(LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")),))

其他信息:

FILTERXML

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

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

由于我们要从单元格返回元素(单词)的数组,因此需要SUBSTITUTE结束标记(</..>)的空格,并将其与起始标记({ {1}})在字符串的开头,另一个end-tag在结尾。

我将不得不依靠标签上的<..>来说明XML起作用的原因及其含义,因为就我的测试而言,我可以交换字母或将其替换为其他字母只要最后一个<?><?>与相同字符相似,其结果相同。如果有人能够对此问题提供更好的解释来补充这个答案,那就太好了。


TEXTJOIN

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

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

现在这是我们可以将两个函数结合在一起的地方,FALSE返回一个可以在FILTERXML中使用的数组。


INDEX + LEN

我将不得不一起解释这些功能的用法。我认为TEXTJOINLEN本身并不需要太多介绍,但是它们在一起可以很好地工作。本地会有一种称为隐式交集的作用力,当您将值数组传递给函数时,将阻止INDEX返回值数组,在这种情况下,是通过我们的LEN

通常,您可以使用以下组合键禁用此机制: Ctrl Shift Enter ,通常称为FILTERXML

现在CSE的工作是禁用此隐式交集,使INDEX能够返回数组,从而无需LEN公式。 CSE是具有此“功能”的功能之一。可以在here

中找到有关隐式交点的更深入的解释

选项2:UDF

无法访问INDEX,我想您需要使用UDF,可能看起来像下面这样:

TEXTJOIN

您可以在Function TEXTJOIN(rng As Range) As String TEXTJOIN = Join(Application.Evaluate("LEN({""" & Join(Split(rng, " "), """,""") & """})"), ",") End Function 中调用它,如下所示:B1


其他信息:

UDF由三个主要机制共同作用:

JOIN

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

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

该函数返回一个字符串值


SPLIT

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

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

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


Application.Evaluate

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

答案 1 :(得分:1)

我不确定您要寻找的最终结果,还是您对VBA解决方案是否满意,但这是我的解释:

Function lengths(txt As String) As String
  Dim wrd
  For Each wrd In Split(txt)
    If lengths <> "" Then lengths = lengths & ","
    lengths = lengths & Len(wrd)
  Next wrd
End Function

将代码粘贴到VBA模块中,然后,例如,如果A1包含Black Cup With Handle,则可以在另一个单元格中使用=length(A1),这将返回5,3,4,6。 / p>

答案 2 :(得分:0)

如果您想使用VBA代码,则可以尝试以下操作:

Option Explicit

Sub test()

    Dim arr As Variant
    Dim str As String
    Dim i As Long, j As Long, LastRow As Long

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For i = 1 To LastRow

            str = .Range("A" & i).Value

            arr = Split(str, " ")

            For j = LBound(arr) To UBound(arr)
                .Cells(i, j + 3).Value = Len(arr(j))
            Next j

        Next i

    End With

End Sub

结果:

enter image description here