【问题标题】:Count multiple values with multiple conditions and ranges in EXCEL/GOOGLE SHEETS在 EXCEL/GOOGLE SHEETS 中计算具有多个条件和范围的多个值
【发布时间】:2020-01-30 13:04:05
【问题描述】:

如果出现以下情况,我公司的员工应该休息一天:
1. 他们上周五夜班(NS)
2. 他们在星期四 NS 和星期六 NS 工作
3. 他们周五早上和周六工作。

我需要计算每个员工应该得到多少天的假期

早上 晚上 工作日 |白天
地点 1|地点 2|地点 3 地点 4|地点 5|地点 6|
DAV FL RI RI 1 10
DAV RI FL DAV 2 11
佛罗里达州 RI DAV 佛罗里达州 3 12
DAV RI FL DAV 4 13
FL RI DAV RI FL 5 14
DAV 6 15
FL DAV 7 16
DAV FL RI RI 1 17
DAV RI FL DAV 2 18
佛罗里达州 RI DAV 佛罗里达州 3 19
DAV RI FL DAV 4 20
FL RI DAV RI 5 21
FL DAV 6 22
RI FL 7 23

在此示例中,FL 休假 2 天
RI 休假 1 天
DAV 休假 2 天

使用 COUNTIFS 可以计算周五的夜班。

=COUNTIFS(D3:D34,"DAV",G3:G34,"6")+COUNTIFS(E3:E34,"DAV",G3:G34,"6")+COUNTIFS(F3:F34,"DAV",G3 :G34,"6")

但是当我必须在 6 个不同的列上使用名称条件时,事情变得复杂了,每个列都有不同的工作日条件,即 T+SAT 或 F+SAT 上的员工, 有没有办法只使用没有脚本的内置公式来实现这一点?

【问题讨论】:

    标签: excel countif


    【解决方案1】:

    您可以尝试以下公式:

    简单的周五晚上:

    =SUMPRODUCT((L2=$D$3:$F$16)*(6=$G$3:$G$16))
    

    星期四晚上 + 星期六晚上更复杂:

    =MIN(SUMPRODUCT((L2=$D$3:$F$16)*(5=$G$3:$G$16)),SUMPRODUCT((L2=$D$3:$F$16)*(7=$G$3:$G$16)))
    

    计算的原则是周四晚上的工作时间分开计算,周六晚上的工作时间分开计算,然后从两个数字中选出最小的。这反过来意味着一个人可以在星期四工作一周,然后在星期六工作两周,然后休息一天。看看对不对。

    以此类推:周五早上 + 周六晚上:

    =MIN(SUMPRODUCT((L2=$A$3:$C$16)*(6=$G$3:$G$16)),SUMPRODUCT((L2=$D$3:$F$16)*(7=$G$3:$G$16)))
    

    【讨论】:

    • 有效!但正如您注意到的那样,休息日仅适用于同一周的 T+SAT 晚上或 F+SAT。有什么建议吗?
    • 我设法将 SUMPRODUCT() 的范围分割为 5 列,在工作表中迭代并总结所有内容。像这样的东西 - =SUM(MIN(SUMPRODUCT((U38=$C$4:$E$8)*("ה"=$A$4:$A$8)),SUMPRODUCT((U38=$C$4:$E$8 )*("ש"=$A$4:$A$8))),MIN(SUMPRODUCT((U38=$C$8:$E$12)*("ה"=$A$8:$A$12)),SUMPRODUCT ((U38=$C$8:$E$12)*("ש"=$A$8:$A$12))),MIN(SUMPRODUCT((U38=$C$12:$E$16)*("ה"= $A$12:$A$16)),SUMPRODUCT((U38=$C$12:$E$16)*("ש"=$A$12:$A$16))), (...)
    【解决方案2】:

    我将您的示例数据转移到工作表中,以便您的早班数据位于 A:C 列中,而夜班数据位于 E:G 列中。关键的工作日列是 H 列。我假设您的数据有 1 = 星期日。

    我创建了两个命名范围“AM”和“PM”,以覆盖早班和夜班的列。范围从第 1 行开始很重要。注意:我的公式不要写在工作表第 3 行上方的一行中。

    我在右侧的布局中添加了列,每个员工一个列,并将员工的姓名写在每列的第 2 行。在我的工作表中,这些列位于 K:M,公式转到 K3。从那里它被复制到我的三列中的所有其他单元格中。

    =IF($H3=6,IF(COUNTIF(INDEX(PM,ROW(),0),K$2),1,""),IF($H3=7,IF(COUNTIF(INDEX(PM,ROW(),0),K$2),IF(OR(COUNTIF(INDEX(AM,ROW()-1,0),K$2),COUNTIF(INDEX(PM,ROW()-2,0),K$2)),1,""),""),""))
    

    我添加的三列显示每个赚取的休息日为 1。

    该公式会丢弃不是周五或周六的所有日子。在星期五,如果该名称出现在 PM 轮班中,它会奖励“1”。如果在同一周的周五上午或周四下午也有工作,则奖励周六下午工作和休息日。根据这条规则,如果那是星期六,您不能在第一天开始您的月份。前一个星期四必须包含在当月的数据中。如果不是,则不会发生错误(除非公式在第 2 行),但由于引用的行不包含有效数据,结果将是错误的。

    【讨论】:

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