在 EXCEL/GOOGLE 个工作表中计算具有多个条件和范围的多个值
Count multiple values with multiple conditions and ranges in EXCEL/GOOGLE SHEETS
我公司的员工在以下情况下应该休息一天:
1. 他们周五上夜班(NS)
2. 他们在星期四 NS 和星期六 NS
3. 他们周五早上和周六NS上班。
我需要计算每个员工应该休多少天
MORNING NIGHT WEEKDAY |DAY
PLACE1|PLACE2|PLACE3 PLACE4|PLACE5|PLACE6|
DAV FL RI RI 1 10
DAV RI FL DAV 2 11
FL RI DAV FL 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
FL RI DAV FL 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 的员工,
有什么方法可以仅使用内置公式 w/o 脚本来实现这一点?
我将您的示例数据传输到工作表中,以便您的早班数据位于 A:C 列中,而夜班数据位于 E:G 列中。关键的工作日列是 H 列。我假设您的数据有 1 = Sunday.
我创建了两个命名范围,"AM" 和 "PM",以涵盖早班和晚班的列。范围从第 1 行开始很重要。注意:同样重要的是,我的公式不要写在工作表中第 3 行上方的一行中。
我在右侧的布局中添加了栏,每个员工一栏,并在每栏的第 2 行中写下了员工的姓名。在我的工作表中,这些列位于 K:M,公式转到 K3。它从那里被复制到我的三列中的所有其他单元格。
=IF($H3=6,IF(COUNTIF(INDEX(PM,ROW(),0),K),1,""),IF($H3=7,IF(COUNTIF(INDEX(PM,ROW(),0),K),IF(OR(COUNTIF(INDEX(AM,ROW()-1,0),K),COUNTIF(INDEX(PM,ROW()-2,0),K)),1,""),""),""))
我添加的三列显示每个休假时间为 1。
该公式会舍弃所有不是星期五或星期六的日子。在星期五,如果该姓名出现在下午班次中,它会奖励“1”。对于周六下午的工作和休息日,如果在同一周的周五上午或周四下午也有工作。根据这条规则,如果第一天是星期六,则您不能在第一天开始您的月份。前一个星期四必须包含在当月的数据中。如果不是,则不会发生错误(除非公式在第 2 行),但由于引用的行不包含有效数据,结果将是错误的。
您可以尝试以下公式:
周五晚上简单:
=SUMPRODUCT((L2=$D:$F)*(6=$G:$G))
周四晚上+周六晚上比较复杂:
=MIN(SUMPRODUCT((L2=$D:$F)*(5=$G:$G)),SUMPRODUCT((L2=$D:$F)*(7=$G:$G)))
计算的原则是星期四加班和星期六加班分开计算,取两者中最小的。这反过来意味着一个人可以在星期四工作一周,然后在星期六工作两周,然后休息一天。看看对不对。
周五上午+周六晚上以此类推:
=MIN(SUMPRODUCT((L2=$A:$C)*(6=$G:$G)),SUMPRODUCT((L2=$D:$F)*(7=$G:$G)))
我公司的员工在以下情况下应该休息一天:
1. 他们周五上夜班(NS)
2. 他们在星期四 NS 和星期六 NS
3. 他们周五早上和周六NS上班。
我需要计算每个员工应该休多少天
MORNING NIGHT WEEKDAY |DAY
PLACE1|PLACE2|PLACE3 PLACE4|PLACE5|PLACE6|
DAV FL RI RI 1 10
DAV RI FL DAV 2 11
FL RI DAV FL 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
FL RI DAV FL 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 的员工, 有什么方法可以仅使用内置公式 w/o 脚本来实现这一点?
我将您的示例数据传输到工作表中,以便您的早班数据位于 A:C 列中,而夜班数据位于 E:G 列中。关键的工作日列是 H 列。我假设您的数据有 1 = Sunday.
我创建了两个命名范围,"AM" 和 "PM",以涵盖早班和晚班的列。范围从第 1 行开始很重要。注意:同样重要的是,我的公式不要写在工作表中第 3 行上方的一行中。
我在右侧的布局中添加了栏,每个员工一栏,并在每栏的第 2 行中写下了员工的姓名。在我的工作表中,这些列位于 K:M,公式转到 K3。它从那里被复制到我的三列中的所有其他单元格。
=IF($H3=6,IF(COUNTIF(INDEX(PM,ROW(),0),K),1,""),IF($H3=7,IF(COUNTIF(INDEX(PM,ROW(),0),K),IF(OR(COUNTIF(INDEX(AM,ROW()-1,0),K),COUNTIF(INDEX(PM,ROW()-2,0),K)),1,""),""),""))
我添加的三列显示每个休假时间为 1。
该公式会舍弃所有不是星期五或星期六的日子。在星期五,如果该姓名出现在下午班次中,它会奖励“1”。对于周六下午的工作和休息日,如果在同一周的周五上午或周四下午也有工作。根据这条规则,如果第一天是星期六,则您不能在第一天开始您的月份。前一个星期四必须包含在当月的数据中。如果不是,则不会发生错误(除非公式在第 2 行),但由于引用的行不包含有效数据,结果将是错误的。
您可以尝试以下公式:
周五晚上简单:
=SUMPRODUCT((L2=$D:$F)*(6=$G:$G))
周四晚上+周六晚上比较复杂:
=MIN(SUMPRODUCT((L2=$D:$F)*(5=$G:$G)),SUMPRODUCT((L2=$D:$F)*(7=$G:$G)))
计算的原则是星期四加班和星期六加班分开计算,取两者中最小的。这反过来意味着一个人可以在星期四工作一周,然后在星期六工作两周,然后休息一天。看看对不对。
周五上午+周六晚上以此类推:
=MIN(SUMPRODUCT((L2=$A:$C)*(6=$G:$G)),SUMPRODUCT((L2=$D:$F)*(7=$G:$G)))