行中的 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
好的,所以我要做的是计算每个月的工作日数,减去 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