有没有一种方法可以计算字符串中每个单词的字符数,并返回以逗号分隔的值?
Is there a way to count the number of characters per word for a string, returning values separated by a comma?
我在单元格中有一个字符串列表 - 其中有 1000 个 - 我需要计算每个单词的字符但按单词分隔 - 最好在 1 swift 公式中...
例如:
1. "Black Cup With Handle" > 我需要的公式 > 5,3,4,6
- "Giant Bear Statue" > 我需要的公式 > 5,4,6
我需要这个用于重复性任务,该任务以一种非常低效的方式进行了宏化,以将单词计入列(其中我们最多需要使用 20 个来进行封装),但这需要解决。
通常,我们计算空格和层嵌套的 serach() 公式以搭载一个和另一个分解结构然后字符计算单个单词...
我也可以用宏来代替逗号的空格,并将文本用于列,但这仍然让我需要很长的时间来计算我正在寻找的内容
我们明明用=LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
来统计单词中的空格
我们目前使用 =SEACRH()
函数结合 =MID()
函数(和一些奇怪的数字)将每个单词显示在它自己的单元格中
然后 =LEN
再次针对所有单个单词 - 非常冗长
我希望找到一个更短的方法来做到这一点,但感觉可能没有足够动态的方法来单独使用公式,希望有人能证明我错了!
我不太清楚您要寻找的最终结果是什么,或者您是否接受 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)
,这将 return 5,3,4,6
.
如果您想使用 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
结果:
根据您的 Excel 版本,您将有不同的选择。
选项 1:TEXTJOIN
我认为您正在寻找 TEXTJOIN
函数。请记住,您只能在 Excel 的更高版本中使用它(请参阅 link 文档)并且它可以像这样工作:
B1
中的公式:
=TEXTJOIN(",",TRUE,LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")))
NOTE: It's an array formula and you need to enter it using CtrlShiftEnter
为了让您不需要使用上面的组合键,我们可以包含一个 INDEX
:
=TEXTJOIN(",",TRUE,INDEX(LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")),))
附加信息:
此函数采用(根据文档)两个必需的参数:
因为我们想要 return 来自单元格的元素(单词)数组,我们需要 SUBSTITUTE
结束标记的 spaces (</..>
) 并将其与字符串开头的开始标记 (<..>
) 和末尾的另一个结束标记连接起来。
我将不得不依靠 XML
对标签的解释来解释为什么 <?><?>
起作用及其含义,因为就我的测试而言,我可以交换字母或替换只要最后的 Xpath
类似于相同的字符,就可以用另一个具有相同结果的字母。如果有人能够通过更好的解释来补充这个答案,那就太好了。
更多FILTERXML
"tricks",看看
如果您是 Office 365 订阅者或拥有 Excel 2019,则可以使用此功能。至少有 3 个必需参数(根据文档):
- 一个分隔符,它必须是一个文本字符串,或者为空,或者用双引号括起来的一个或多个字符,或者是对有效文本字符串的引用。如果提供了数字,它将被视为文本。
- 第二个参数可以包含
TRUE
或 FALSE
并确定您是否要 exclude/include 空值
- 第三个参数是要连接的文本项。文本字符串或字符串数组,例如单元格区域。
现在这是我们可以将两个函数连接在一起的地方,FILTERXML
return我们可以在 TEXTJOIN
.
中使用一个数组
这几个函数的用法我得一并说明。我认为 LEN
和 INDEX
本身不需要太多介绍,但它们一起工作得很好。当您将值数组传递给函数时,本机将存在一种称为隐式交集的力量,它会阻止 LEN
从 return 获取值数组,在本例中是通过我们的 FILTERXML
。
通常您会使用以下组合键禁用此机制:CtrlShiftEnter ,更广为人知的是 CSE
。
现在 INDEX
所做的是禁用此隐式交集,使 LEN
能够 return 一个数组,从而无需 CSE
公式。 INDEX
是具有此 "power" 的函数之一。可以找到关于隐式交集的更深入的解释
选项 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 由三个协同工作的主要机制组成:
此函数有两个参数,其中第一个参数是必需的:
- 第一个参数是一个包含子字符串的一维数组
- 第二个(可选)参数是一个字符串字符,用于分隔 returned 字符串中的子字符串。如果省略,则使用 space 字符 (" ")。如果定界符是零长度字符串 (""),则列表中的所有项目都没有定界符连接。
函数return是一个字符串值
此函数接受一个字符串并用指定的 character/substring 分隔它。它采用以下参数:
- 1st:包含子字符串和定界符的必需字符串表达式。如果expression是一个零长度的字符串(""),拆分returns一个空数组,即没有元素也没有数据的数组。
- 2nd: 可选的分隔符,它是一个字符串字符,用于标识子字符串限制。如果省略,则假定 space 字符 (" ") 为定界符。如果 delimiter 是零长度字符串,则包含整个表达式字符串的单元素数组是 returned.
- 3rd:一个可选的限制,要return编辑的子字符串的数量; -1 表示所有子串都是returned.
- 4th:Compare,也是可选的,是一个数值,指示在评估子字符串时使用的比较类型。有关值,请参阅设置部分。
在这种情况下,我们只需要前两个参数。
这是 IMO 最方便的机制之一,您可以使用它来提取 returned 值数组,而无需循环遍历 items/cells。当您为函数提供大型数组公式时,它可能会变慢,但在这种情况下会很好。该函数将 Microsoft Excel 名称转换为对象或值,当我们将公式传递给它时,它将 return 结果。在这种特殊情况下,它将 return 一个数组。
我在单元格中有一个字符串列表 - 其中有 1000 个 - 我需要计算每个单词的字符但按单词分隔 - 最好在 1 swift 公式中...
例如: 1. "Black Cup With Handle" > 我需要的公式 > 5,3,4,6
- "Giant Bear Statue" > 我需要的公式 > 5,4,6
我需要这个用于重复性任务,该任务以一种非常低效的方式进行了宏化,以将单词计入列(其中我们最多需要使用 20 个来进行封装),但这需要解决。
通常,我们计算空格和层嵌套的 serach() 公式以搭载一个和另一个分解结构然后字符计算单个单词...
我也可以用宏来代替逗号的空格,并将文本用于列,但这仍然让我需要很长的时间来计算我正在寻找的内容
我们明明用=LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
来统计单词中的空格
我们目前使用 =SEACRH()
函数结合 =MID()
函数(和一些奇怪的数字)将每个单词显示在它自己的单元格中
然后 =LEN
再次针对所有单个单词 - 非常冗长
我希望找到一个更短的方法来做到这一点,但感觉可能没有足够动态的方法来单独使用公式,希望有人能证明我错了!
我不太清楚您要寻找的最终结果是什么,或者您是否接受 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)
,这将 return 5,3,4,6
.
如果您想使用 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
结果:
根据您的 Excel 版本,您将有不同的选择。
选项 1:TEXTJOIN
我认为您正在寻找 TEXTJOIN
函数。请记住,您只能在 Excel 的更高版本中使用它(请参阅 link 文档)并且它可以像这样工作:
B1
中的公式:
=TEXTJOIN(",",TRUE,LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")))
NOTE: It's an array formula and you need to enter it using CtrlShiftEnter
为了让您不需要使用上面的组合键,我们可以包含一个 INDEX
:
=TEXTJOIN(",",TRUE,INDEX(LEN(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s")),))
附加信息:
此函数采用(根据文档)两个必需的参数:
因为我们想要 return 来自单元格的元素(单词)数组,我们需要 SUBSTITUTE
结束标记的 spaces (</..>
) 并将其与字符串开头的开始标记 (<..>
) 和末尾的另一个结束标记连接起来。
我将不得不依靠 XML
对标签的解释来解释为什么 <?><?>
起作用及其含义,因为就我的测试而言,我可以交换字母或替换只要最后的 Xpath
类似于相同的字符,就可以用另一个具有相同结果的字母。如果有人能够通过更好的解释来补充这个答案,那就太好了。
更多FILTERXML
"tricks",看看
如果您是 Office 365 订阅者或拥有 Excel 2019,则可以使用此功能。至少有 3 个必需参数(根据文档):
- 一个分隔符,它必须是一个文本字符串,或者为空,或者用双引号括起来的一个或多个字符,或者是对有效文本字符串的引用。如果提供了数字,它将被视为文本。
- 第二个参数可以包含
TRUE
或FALSE
并确定您是否要 exclude/include 空值 - 第三个参数是要连接的文本项。文本字符串或字符串数组,例如单元格区域。
现在这是我们可以将两个函数连接在一起的地方,FILTERXML
return我们可以在 TEXTJOIN
.
这几个函数的用法我得一并说明。我认为 LEN
和 INDEX
本身不需要太多介绍,但它们一起工作得很好。当您将值数组传递给函数时,本机将存在一种称为隐式交集的力量,它会阻止 LEN
从 return 获取值数组,在本例中是通过我们的 FILTERXML
。
通常您会使用以下组合键禁用此机制:CtrlShiftEnter ,更广为人知的是 CSE
。
现在 INDEX
所做的是禁用此隐式交集,使 LEN
能够 return 一个数组,从而无需 CSE
公式。 INDEX
是具有此 "power" 的函数之一。可以找到关于隐式交集的更深入的解释
选项 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 由三个协同工作的主要机制组成:
此函数有两个参数,其中第一个参数是必需的:
- 第一个参数是一个包含子字符串的一维数组
- 第二个(可选)参数是一个字符串字符,用于分隔 returned 字符串中的子字符串。如果省略,则使用 space 字符 (" ")。如果定界符是零长度字符串 (""),则列表中的所有项目都没有定界符连接。
函数return是一个字符串值
此函数接受一个字符串并用指定的 character/substring 分隔它。它采用以下参数:
- 1st:包含子字符串和定界符的必需字符串表达式。如果expression是一个零长度的字符串(""),拆分returns一个空数组,即没有元素也没有数据的数组。
- 2nd: 可选的分隔符,它是一个字符串字符,用于标识子字符串限制。如果省略,则假定 space 字符 (" ") 为定界符。如果 delimiter 是零长度字符串,则包含整个表达式字符串的单元素数组是 returned.
- 3rd:一个可选的限制,要return编辑的子字符串的数量; -1 表示所有子串都是returned.
- 4th:Compare,也是可选的,是一个数值,指示在评估子字符串时使用的比较类型。有关值,请参阅设置部分。
在这种情况下,我们只需要前两个参数。
这是 IMO 最方便的机制之一,您可以使用它来提取 returned 值数组,而无需循环遍历 items/cells。当您为函数提供大型数组公式时,它可能会变慢,但在这种情况下会很好。该函数将 Microsoft Excel 名称转换为对象或值,当我们将公式传递给它时,它将 return 结果。在这种特殊情况下,它将 return 一个数组。