行中的 COUNTIFS 日期是工作日

COUNTIFS date in row is a workday

好的,所以我要做的是计算每个月的工作日数,减去 public 假期。

B2     -- the current year
E2:E13 -- the first day of each month
F2:F13 -- the amount of days (workday or otherwise) in that month, that year
G2:G13 -- the amount of WORK days in that month (i.e. the formula I'm trying ot write)
A8:A   -- the public holidays

我可以利用这些并创建一个公式(此处为 G2

=NETWORKDAYS(CONCATENATE("1.",MONTH(E2),".",$B),CONCATENATE(F2,".",MONTH(E2),".",$B), $A:A)

(利用日期格式 dd.mm.yyyy

问题是其中一些假期只有 半天 休息,而这个公式会给人们全天休息。

因此,一种方法可以是简单地 添加 半天,当月每半天被错误地算作一整天。

假设我有

C8:C   -- is the holiday in the A cell of the same row a half-day?

这将我们的公式变成了

=NETWORKDAYS(CONCATENATE("1.",MONTH(E2),".",$B),CONCATENATE(F2,".",MONTH(E2),".",$B), $A:A)+COUNTIFS($A:A,">"&EOMONTH(E2,-1),$A:A,"<"&EOMONTH(E2,0)+1,$C:C,TRUE)*0.5

(编辑:example sheet

但现在问题来了:那个假期可能恰逢周末。

因此,如果恰好是休息半天的假期不小心放在了星期天,比如说,我们只是错误地增加了半天的工作。

我需要的是一个附加条件,如果假期日期是工作日,它将评估为“真”,

[...]+COUNTIFS([...], $A:A, NETWORKDAYS(ROW,ROW) > 0)*0.5

不过我不知道如何引用这样的行。

最简单的方法是使用帮助列来为我计算这个布尔值,但这很丑陋,因为与 'half-day' 列不同,我们不希望用户能够修改这些值,因此他们看到专栏只会让他们感到困惑。)

如何在countifs中写条件?

更新公式:

我认为应该这样做。尽管可能还有其他甚至更简洁的方法。

如果在 FILTER() 中找到匹配项,它会在半天后添加回来。

=ARRAYFORMULA(NETWORKDAYS(E2,EOMONTH(E2,0),A:A)+IFERROR(FILTER(C:C,EOMONTH(A:A,0)=EOMONTH(E2,0),C:C,WEEKDAY(A8:A18,2<6))/2))

我找到了一个不使用 countifs 的简单解决方案。您要查找的结果是三个值的总和:

  • 结果=一个月工作天数-全休天数-半休假天数*0.5

为此,我们将从计算一个月中的工作日、工作日减去全假期和工作日减去半假期开始

  • WD: =NETWORKDAYS( CONCATENATE("1.",MONTH(E5),".",$B), CONCATENATE(CONCATENATE(F5,".",MONTH(E5),".",$B))
  • WD_FULL_H:=NETWORKDAYS( CONCATENATE("1.",MONTH(E5),".",$B), CONCATENATE(F5,".",MONTH(E5),".",$B), filter(A8:A,C8:C=FALSE)))
  • WD_HALF_H: =NETWORKDAYS( CONCATENATE("1.",MONTH(E5),".",$B), CONCATENATE(F5,".",MONTH(E5),".",$B), filter(A8:A,C8:C=TRUE)).

通过这种方式,我们可以确保任何与 public 假期重合的假期都不会改变最终结果。接下来,我们计算最后的工作日。为此,我们需要得到当月有多少个全休假和半休假,我们通过减去当月的工作日数得到:

  • 最终 WD:WD - (WD - WD_FULL_H) - (WD - WD_HALF_H) * 0.5

简化:

  • 最终 WD:WD_FULL_H - (WD - WD_HALF_H) * 0.5

最后,不用辅助计算:

  • 最终 WD:
=NETWORKDAYS(
CONCATENATE("1.",MONTH(E5),".",$B),
CONCATENATE(F5,".",MONTH(E5),".",$B), 
filter(A8:A,C8:C=FALSE)) 
-
(NETWORKDAYS(
CONCATENATE("1.",MONTH(E5),".",$B),
CONCATENATE(F5,".",MONTH(E5),".",$B))) 
-
NETWORKDAYS(
CONCATENATE("1.",MONTH(E5),".",$B),
CONCATENATE(F5,".",MONTH(E5),".",$B), 
filter(A8:A,C8:C=TRUE)))
*0.5