3

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

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

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

我需要这个用于重复性任务,该任务以非常低效的方式进行宏化以将单词计数到列中(我们需要使用最多 20 个用于刚刚封装的列),但这需要解决。

通常,我们计算空格和层嵌套的 serach() 公式以搭载在一个和另一个上以分解结构,然后字符计算单个单词......

我也可以用宏来替换逗号的空格并将文本用于列,但这仍然让我有一个长时间的计数过程来寻找我正在寻找的东西

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

然后我们现在使用=SEACRH()函数结合=MID()函数(和一些奇怪的数字)将每个单词显示到它自己的单个单元格中

然后=LEN再次对所有单个单词进行bu - 非常啰嗦

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

4

3 回答 3

4

根据您的 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“技巧”,看这里


TEXTJOIN

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

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

现在这是我们可以将两个函数连接在一起的地方,FILTERXML返回一个我们可以使用的数组TEXTJOIN


INDEX+LEN

我将不得不一起解释这些功能的使用。我不认为也不LEN需要INDEX对他们自己做太多介绍,但他们一起工作得很好。原生会有一种称为隐式交集的力,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 由三个协同工作的主要机制组成:

JOIN

这个函数有两个参数,其中第一个是必需的:

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

该函数返回一个字符串值


SPLIT

此函数接受一个字符串并用指定的字符/子字符串分隔它。它采用以下参数:

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

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


Application.Evaluate

这是 IMO 最方便的机制之一,您可以使用它来提取返回的值数组,而无需遍历项目/单元格。当你为函数提供一个大数组公式时,它可能会变慢,但在这种情况下它会很好。该函数将 Microsoft Excel 名称转换为对象或值,当我们将公式传递给它时,它将返回结果。在这种特殊情况下,它将返回一个数组。

于 2019-11-02T18:33:01.697 回答
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.

于 2019-11-02T17:28:44.133 回答
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

结果:

在此处输入图像描述

于 2019-11-02T17:33:55.847 回答