【问题标题】:How to use COUNTIF on date range - only counting duplicates once如何在日期范围内使用 COUNTIF - 只计算一次重复
【发布时间】:2018-07-22 20:31:29
【问题描述】:

目前。当有人在 E 列(采取的行动)中输入信息时,我已经设置了它,然后整行将变为黄色,因此很容易看出该项目正在处理中。

我设置的另一种条件格式是,一旦输入 F 列的日期超过 5 个工作日(执行日期),该行将变为红色,提醒用户追查问题再次。

用户每周都会就所列产品联系列表中的更多供应商,并填写他们采取的行动和采取行动的日期。

我想做的是将一周内联系的所有供应商加起来(即第 1 周,05.02.1809.02.18)我知道可以使用公式来完成;

=COUNTIFS(F4:F18,">=5/2/18",F4:F18,"<=9/2/2018")

但是我只想统计每家公司一次!因此,即使在05.02.1809.02.18 之间进行了 8 次行动,他们也只联系了 4 个供应商。

这可能吗? (仅供参考,随附的屏幕截图只是真实文档的快速模型,其中包含数千种产品和更深入的信息)。

【问题讨论】:

  • 非常感谢,这非常有效!我知道会有一个简单的解决方案,我只是想多了。

标签: excel-formula formula countif formulas excel-2016


【解决方案1】:

如果您只进行 1 周的计算,那么“逃避”路线将是有一个数据透视表,其中公司作为行,日期作为列。然后过滤您的列,您会在该周获得每个公司的一行。

完整路径意味着查看数组公式 - 您可以像往常一样键入其中一个,但不是按 [Enter],而是按 [Ctrl]+[Shift]+[Enter],公式将显示在大括号中. (这就是为什么它们有时被称为“CSE 公式”,表示“Control、Shift、Enter”)

~警告 - 这是我如何计算最终公式的漫长过程。希望它会有意义!~

数组公式可让您遍历范围内的每一行,分别计算它们,然后在最后将它们全部相加。这给了我们外部术语 - 一切都在 =SUM(..) 中。按[Ctrl]+[Shift]+[Enter],显示为{=SUM(..)}

现在,我们希望每行进行什么计算?好吧,对于 F 列在日期内的每一行,您希望在日期内有 1 个 per 公司。好吧,另一个是说“per”是“除以”(因此“Percentage”符号是“0 / 0”或“%”,而较小的人知道“Permille”符号是“0 / 00”或“‰” )

为了重现性,我将假设您的计数是在单元格 J2 中完成的,并且您在单元格 H2 和 I2 中有开始/结束日期

第 4 行的公式将以 =IF(AND(F4&gt;=$H2,F4&lt;=$I2), 1/???, 0) 开头,其中 ??? 是第 4 行中公司出现的次数。不幸的是,AND 函数不适用于数组公式。 幸运的是有一个简单的解决方法 - 因为布尔 True/False 可以被视为二进制 1/0,AND 运算符与乘法相同。通过双重否定将布尔值转换为二进制是最快的,所以AND(F4&gt;=H2,F4&lt;=I2) 可以重写为--(F4&gt;=H2)*--(F4&lt;=I2),它可以很好地与数组公式一起使用,给我们=IF(--(F4&gt;=H2)*--(F4&lt;=I2), 1/???, 0)

现在,在我们确定??? 应该是什么之前,我要跳到第 18 行。我保证,这种疯狂是有办法的!按照上面列出的规则,第 18 行的公式是 =IF(--(F18&gt;=H2)*--(F18&lt;=I2), 1/???, 0) - 相当简单?现在,如果我们想对从 4 到 18 的所有行运行此操作,我们只需要加入范围。所以,你会得到=IF(--(F4:F18&gt;=H2)*--(F4:F18&lt;=I2), 1/???, 0) 把它变成一个数组公式会给你一个“1/???”和“0”的数组,所以把它和SUM 加在一起得到一个“平面”数字:=SUM(IF(--(F4:F18&gt;=H2)*--(F4:F18&lt;=I2), 1/???, 0))

还记得我之前提到的“方法”吗?好吧,如果我们正在寻找采取的行动的直接计数,忽略唯一公司约束,我们可以让??? = 1,得到=SUM(IF(--(F4:F18&gt;=$H2)*--(F4:F18&lt;=$I2), 1, 0)),然后点击 [Ctrl]+[Shift]+[Enter] - 这将给出与=COUNTIF(F4:F18, "&gt;="&amp;H2, F4:F18, "&lt;="&amp;I2) 相同的结果 - 将1 更改为D4:D18 将是产品上的SUMIF。 (顺便说一句,您可以从 CountIf 中删除 IF 语句,因为 Condition 已经返回 1 或 0)

所以,最后一步!什么是 ??? 嗯,它是 Date Actioned 在我们的日期范围内的行数,并且 Company 与当前行相同。因此,对于第 4 行,您有 COUNTIFS(B4:B18, B4, F4:F18, "&gt;="&amp;H2, F4:F18, "&lt;="&amp;I2),对于第 18 行,您有 COUNTIFS(B4:B18, B18, F4:F18, "&gt;="&amp;H2, F4:F18, "&lt;="&amp;I2),使最终的 ??? 变为 COUNTIFS(B4:B18, B4:B18, F4:F18, "&gt;="&amp;H2, F4:F18, "&lt;="&amp;I2)(这里的技巧是 Range 参数被视为一次所有单元格,但 Condition 参数被视为每个单元格的数组,一次一个)

现在,有些人可能会争辩说,为了安全起见,您需要将 1/COUNTIFS(B4:B18, B4:B18, F4:F18, "&gt;="&amp;H2, F4:F18, "&lt;="&amp;I2) 放在 IFERROR 中 - 但是,这是在 IF 语句的 TRUE 部分中引用同一行,所以我们知道,如果正在评估 COUNTIF,那么将总是至少有 1 行匹配。

因此,如果我们将它们全部粘贴在一起,并添加大量 $ 符号以将行/列锁定到位(这样您就可以向下拖动列 J 以计算列 H 和 I 中的不同周/日期) 你得到的(有点笨拙的)公式如下:

=SUM(IF(--($F$4:$F$18>=$H2)*--($F$4:$F$18<=$I2), 1/COUNTIFS($B$4:$B$18, $B$4:$B$18, $F$4:$F$18, ">=" & $H2, $F$4:$F$18, "<=" & $I2), 0))

最后一次 - 别忘了按 [Ctrl]+[Shift]+[Enter]

(两个日期单元格,$H2 和 $I2 是我留下“解锁”的唯一条件,即使那样也只在行上)

【讨论】:

    【解决方案2】:

    如果您不介意添加几个工作列,以下是一个可能的解决方案:

    步骤 1

    设置两个单元格以包含您在公式=COUNTIFS(F4:F18,"&gt;=5/2/18",F4:F18,"&lt;=9/2/2018") 中使用的范围的最小和最大日期。这将允许您更新内容,而不必每次都重新复制公式。我分别使用单元格 E1 和 G1 作为最小和最大日期。

    第二步

    在新列中生成符合您的条件的供应商 ID 列表。我随意选择了H列。我把下面的公式放在H4中并复制下来:

    =IF(AND(F4>=$E$1,F4<=$G$1),A4,"")
    

    第三步

    在新列中生成供应商 ID 从 H 列首次出现的计数列表,不计算空格。我随意选择了I列。我把下面的公式放在I4中并复制下来:

    =--(AND(COUNTIF($H$4:H4,H4)=1,H4<>""))
    

    第四步

    对第3步的结果求和。我随意选择将以下公式放在I19中:

    =SUM(I4:I18)
    

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多