【问题标题】:How to count the number of times a string appears in a range of cells如何计算字符串出现在单元格区域中的次数
【发布时间】:2020-07-19 14:55:13
【问题描述】:
 <br>1<br>text <br>2<br>text <br>3<br>
 <br>4<br>
 <br>5<br>text <br>6<br>text <br>7<br>text <br>8<br>

计算 &lt;br&gt;*&lt;br&gt; 在此表 A1:A3 中出现的次数的公式是什么?请记住,每个单元格的前面都有一个空格。

总数应该是 8。但是=COUNTIF(A1:A3," &lt;br&gt;*&lt;br&gt;") 只返回 3。

编辑:使数据更简单,因此更易于阅读

【问题讨论】:

  • 返回 3 因为有 3 行
  • @MohsenAlyafei 我也试过 =(LEN(A1:A3)-LEN(SUBSTITUTE(A1:A3, "
    *
    ","")))/LEN("
    *
    ") 但是它返回 0
  • countif 返回单元格的个数(不是字符串的出现次数)

标签: excel excel-formula


【解决方案1】:

此 Microsoft 文档链接可以帮助您解决您想要实现的目标的多种变体 - https://docs.microsoft.com/en-us/office/troubleshoot/excel/formulas-to-count-occurrences-in-excel

要计算某个单元格区域中子字符串的出现次数,可以使用以下命令:

SUM(LEN(range)-LEN(SUBSTITUTE(range,"text","")))/LEN("text")

如果以上方法不适合你,你可以试试这个:

数字:

要计算 一个 单元格中子字符串的出现次数,可以使用 Excel 中的公式组合。

简答(只需将您的特定文本或单元格引用插入其中):

=(LEN("original_text")-LEN(SUBSTITUTE("original_text","text_to_count","")))/LEN("text_to_count")

如果您有兴趣,请详细回答:

  1. SUBSTITUTE(x, y, z) - 获取原始文本 (x) 和要查找的文本 (y) 并将 x 中所有出现的 y 替换为 z 并返​​回字符串。在您的情况下(为简洁起见,我选择了一个较小的字符串):

=SUBSTITUTE("123331&lt;br&gt;asdsdas &lt;br&gt;","&lt;br&gt;","")

这会将所有出现的
替换为原始字符串中的空字符串 - 123331asdsdas

  1. LEN(x) - 只返回 x 的长度。在您的情况下:

=LEN(SUBSTITUTE("123331&lt;br&gt;asdsdas &lt;br&gt;","&lt;br&gt;",""))

这将返回 14,即 123331asdsdas 的长度。

  1. =LEN("123331&lt;br&gt;asdsdas &lt;br&gt;") 给你 22。

  2. =LEN("123331&lt;br&gt;asdsdas &lt;br&gt;") - LEN(SUBSTITUTE("123331&lt;br&gt;asdsdas &lt;br&gt;","&lt;br&gt;","")) 从原始字符串的长度中减去替换字符串的长度,得到 8。

  3. (LEN("123331&lt;br&gt;asdsdas &lt;br&gt;") - LEN(SUBSTITUTE("123331&lt;br&gt;asdsdas &lt;br&gt;","&lt;br&gt;","")))/LEN("&lt;br&gt;") 将上述答案从减法中除以原始字符串的长度,得到 2

这是
在一个单元格中出现的次数。

  1. 用简单的英语,我们做了(length_of_original_string - length_of_substituted_string)/length_of_string_to_find,在你的情况下翻译成(22-14)/4 = 2

【讨论】:

  • 似乎 LEN(range) 至少不适用于 Mac OS 的 Excel。不确定窗户。如果它不适合您,您可以单独计算长度,然后将它们相加。那会起作用的。
  • 我要查找的是第一个
    之间的文本,前面有一个空格,直到/包括第二个
    。如果您突出显示第一个公式,您将看到每个单元格中的数据前面有空格,并且单元格内的某些
    字符串前面有空格。原始问题中的数字组是总数,所以 8。您的答案似乎忽略了空格
  • 我想你需要一个 mid 函数。
  • 我的错,我没有正确理解你的问题。您需要空格的出现
    num
    如果您知道 VBA,您可以使用正则表达式轻松做到这一点。
  • 我相信你的第一个公式在这种情况下总是有效的:=SUMPRODUCT(INT((LEN(A1:A3)-LEN(SUBSTITUTE(A1:A3,"&lt;br&gt;","")))/LEN("&lt;br&gt;")/2))
【解决方案2】:

这看起来像 XML/HTML,所以为什么不通过 FILTERXMLXPATH 构造解析它,以计算 包含空格并且是 不是为空。例如你的数据在A1:

=COUNTA(FILTERXML("<t><br>"&SUBSTITUTE(CONCAT(A1:A3),"<br>","</br><br>")&"</br></t>","//br[not(contains(., ' '))][node()]"))

或者当您的有效数据可以包含空格时,我们需要过滤掉以空格结尾的那些(以及再次为空的):

=COUNTA(FILTERXML("<t><br>"&SUBSTITUTE(CONCAT(A1:A3),"<br>","</br><br>")&"</br></t>","//br[not(substring(., string-length(.), 1)=' ')][node()]"))

如果您所追求的只是数字节点,那么请使用:

=COUNT(FILTERXML("<t><br>"&SUBSTITUTE(CONCAT(A1:A3),"<br>","</br><br>")&"</br></t>","//br[.*0=0]"))

很酷的是FILTERXML 实际上会返回一个数组以供进一步分析,在您的情况下,您可以计算数组中的元素。

【讨论】:

  • 建议用CONCAT(A1:A3)替换A1
  • @RonRosenfeld, A1:A3 就在我面前,我没有注意到。感谢您的额外关注。
【解决方案3】:

或者,

在B1输入公式:

=SUMPRODUCT(LEN(A1:A3)-LEN(SUBSTITUTE(A1:A3," ","")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多