在 COUNTIF 中包含 OR 条件吗?

在 COUNTIF 中包含 OR 条件吗?

这个问题以前就有人问过,答案似乎总是将两个COUNTIF数字相加。这对于大多数应用程序来说都很好,但对我来说却不行。

我有一列,其中可以包含 0、1 或多个有效标记以及 0、1 或多个无效标记。例如,如果 A、B 和 C 是有效标记,而 D、E 和 F 是无效标记,那么我可能会得到如下表中“标记”列中的数据。我添加了“有效计数”和“有效”列来显示不同的解释。

    ╔══════╦═══════╦═════════════╦═════════╗
    ║ 行号 ║ 标记数 ║ 有效计数 ║ 有效 ║
    ╠══════╬════════╬══════════════╬════════╣
    ║ 1 ║ A,E ║ 1 ║ 真 ║
    ║ 2 ║ ║ 0 ║ 错误 ║
    ║ 3 ║ B ║ 1 ║ 正确 ║
    ║ 4 ║ F,G ║ 0 ║ 错误 ║
    ║ 5 ║ A、B、C ║ 3 ║ 正确 ║
    ║ 6 ║ C ║ 1 ║ 正确 ║
    ╚══════╩════════╩═════════════╩════════╝

我可以使用以下内容来计算有效标记的实例(其中原始数据位于名为“原始”的工作表上,标记位于 AD 列中,而相关标记位于名为“摘要”的工作表上的单元格 A30 中):

=COUNTIF(Raw!$AD$2:$AD$79,CONCATENATE("*",Summary!$A30,"*"))

问题是,如果我对每个有效标记都执行此操作并将它们相加,我最终会计算出有效标记的总数。我想要做的是获取具有至少一个有效令牌的单元格数量用上面的例子来说,正确答案是 4,而不是 6。

我想要做的是使用OR这样的函数:

=COUNTIF(Raw!$AD$2:$AD$79,OR(CONCATENATE("*",Summary!$A30,"*"),CONCATENATE("*",Summary!$A31,"*"),[...snip...]))

但这给出的是 0。

有办法吗?最好不要使用 VBA。

答案1

这里有两种可能的公式方法 - 如果单元格 Summary!A30:A32 中显示“有效标记”(每个标记一个),那么您可以使用此版本

=SUMPRODUCT((ISNUMBER(SEARCH(Summary!A30,Raw!$AD$2:$AD$79))+ISNUMBER(SEARCH(Summary!A31,Raw!$AD$2:$AD$79))+ISNUMBER(SEARCH(Summary!A32,Raw!$AD$2:$AD$79))>0)+0)

或者更容易“扩展”更大的标准范围尝试这个数组公式

=SUM((MMULT(ISNUMBER(SEARCH(TRANSPOSE(Summary!A30:A32),Raw!$AD$2:$AD$79))+0,{1;1;1})>0)+0)

确认CTRL+SHIFT+ENTER

{1;1;1} 需要与条件范围的长度相匹配,并且仅当条件范围是垂直时才需要 TRANSPOSE.....

答案2

您也许可以找到所有零,然后从总数中减去这些零?

我在想:

=counta(Raw!$AD$2:$AD$79)-countif(Raw!$AD$2:$AD$79,0)

[我假设范围内没有空白单元格AD2:AD79]

这似乎让我明白了你想要什么。你能确认一下吗?

编辑:好的,看来你的初始数据不是全部你实际上拥有什么,那么,改变方法。

我建议在一个附加列(单元格C2)中使用此公式:

=IF(AND(ISERROR(FIND("A",B2)),ISERROR(FIND("B",B2)),ISERROR(FIND("C",B2))),0,1)

0如果 A、B 或 C 中有一个不在单元格 中,则给出结果;如果 A、B 或 C 中有一个在单元格 中,B2则给出结果。1B2

拖到底部。Excel 的状态栏会显示总数,或者您也可以=SUM()在列上使用函数。

答案3

我的第一个想法是使用COUNTIFS函数,但将ANDs条件结合在一起。这OR是正确的想法,但正如您所注意到的,它不会测试 OR 条件内的单元格值。

我唯一能想到的办法就是使用 VBA。我将您的示例标记放在工作表的前六行中,并想出了此代码。它可以轻松修改为新函数,也可以用作公式。

子计数代币()

    Dim count 作为整数
    Dim 标记作为字符串
    Dim tokens 作为变体

    对于 Sheet1 中的每个单元格.Range("A1:A6")
        标记 = 拆分(Cell.Value,“,”)
        对于 tIndex = LBound(tokens) 到 UBound(tokens)
            令牌 = 令牌(tIndex)
            如果 token = “A” 或 token = “B” 或 token = “C” 则
                计数 = 计数 + 1
                退出
            万一
        下一頁
    下一个单元

    MsgBox "计数:" & count

子目录结束

相关内容