【问题标题】:Formula for comparing 2 columns for containing data and counting their occurence?比较两列以包含数据并计算它们的出现的公式?
【发布时间】:2020-10-27 20:32:34
【问题描述】:

我在比较 Excel 中的数据时遇到了问题。我之前问过一个类似的问题(Is there any Excel Formula for comparing 2 columns for containing data and counting their occurrence?),但我的问题仍然没有解决。

所以请帮助我,有人。我将展示一个我想要获得什么的示例:

正如您从这些屏幕截图中看到的那样,只有当它完全匹配时,公式才会返回“1”值,但我需要一个近似匹配。例如,如果我需要“Apple”并且我有“Apple Inc”公式必须返回“1”,因为单元格包含“Apple”。

我将附上此 gsheet 的链接,以使我的问题更清楚。

https://docs.google.com/spreadsheets/d/1croUUM3XZTblqpqIva73qX54JeR8oC1cCsMOWyCW1us/edit#gid=0

【问题讨论】:

    标签: arrays google-sheets match google-sheets-formula array-formulas


    【解决方案1】:

    您的COUNTIF 条件似乎颠倒了。我们以您的第一条记录为例:

    ="Apple5"    |    =COUNTIF('Named Focus List'!A:A, "*" & A2 & "*")
    

    替换值:

    =COUNTIF({"What do I need";"Apple";"Orange";"Melon"} "*Apple5*")
    

    所以,这会计算“列表{"What do I need";"Apple";"Orange";"Melon"} 中有多少值在其中的任何位置包含文本"Apple5"?”答案是,没有。

    实际上想知道的是“{"What do I need";"Apple";"Orange";"Melon"} 列表中的值有多少包含在文本"Apple5"

    现在,起初这似乎很容易:交换 2 个参数:

    =COUNTIF(A2, "*" & 'Named Focus List'!A:A & "*")
    

    但是,你会得到一个错误! (根据您使用的 Excel 或 GoogleSheets 版本,这可能是 #VALUE!#SPILL! 错误)

    这是因为它将为列表中的每个条目返回一个结果数组(即{0,1,0,0})。要将这些全部添加到一个值中,我们可以将它们全部包装在 SUMPRODUCT 中:(这样做意味着我们也不必担心按下 Ctrl+Shift +Enter 表示数组公式)

    =SUMPRODUCT(COUNTIF(A2, "*" & 'Named Focus List'!A:A & "*"))
    

    更好?嗯,稍微。您可能会注意到您的数字现在高得离谱。这是因为它还将 每个空白行 计为匹配项。哎呀! (这只是避免整列计算的众多原因之一

    有几种方法可以解决这个问题 - 您可以手动对列表范围进行硬编码,但我将使用 INDEX 来查找底部单元格:

    =SUMPRODUCT(COUNTIF(A2, "*" & 'Named Focus List'!$A$1:INDEX('Named Focus List'!$A:$A, MAX(COUNTA('Named Focus List'!$A:$A),1)) & "*"))
    

    MAX(.., 1) 只是为了确保我们始终查看至少一个单元格,COUNTA 表示如果列中有 7 个值,那么我们查看前 7 行,如果有列中有 100 个值,然后我们查看前 100 行。尽量不要在列表中间留下空白单元格!

    【讨论】:

      【解决方案2】:

      我喜欢 Chronocidal 的解决方案,但这种方式更能说明问题:

      =SUM(1*NOT(ISERROR(FIND('Named Focus List'!$A2:A4,Sheet1!A2))))
      

      我认为这让我们想要完成的工作更加清晰。如果 A2 在 A2 到 A4 的每个元素中都包含子字符串,则“查找”返回数字位置向量,如果不包含则返回错误。如果 A2 在 A2 到 A4 的每个元素中都包含子字符串,则“iserror”和“not”的组合返回一个值为 TRUE 的向量。乘以 1 会将 TRUE 变为 1,将 FALSE 变为零值。然后“sum”函数生成所需的计数。

      您可以使用 Chronocidal 的巧妙代码来避免对列表范围进行硬编码,但我会担心强制执行无空白单元格要求。

      【讨论】:

        【解决方案3】:

        在D2中,将数组公式(按“Ctrl”+“Shift”+“Enter”确认)复制下来:

        =0+(COUNT(SEARCH('Named Focus List'!$A$2:$A$4,$A2))>0)
        

        【讨论】:

          【解决方案4】:

          使用:

          =ARRAYFORMULA(N(REGEXMATCH(A2:A, 
           TEXTJOIN("|", 1, 'Named Focus List'!A2:A))))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-25
            • 1970-01-01
            • 2016-08-29
            • 1970-01-01
            • 1970-01-01
            • 2021-05-18
            • 2019-11-04
            • 1970-01-01
            相关资源
            最近更新 更多