给定日期范围,计算每个支付期间的工作日数#

时间:2009-11-23 13:16:32

标签: excel datetime excel-2007

我在Excel2007中有大约6500多行的列表。每行代表一个人在开始日期和结束日期的残疾假期。如果没有结束日期,则结束日期设置为12/31/9999。一些值的样本如下:

Workers Compensation    4/7/2009    12/31/9999
Workers Compensation    5/21/2009   12/31/9999
Short Term Disability   8/27/2009   10/7/2009
Short Term Disability   6/22/2009   7/15/2009
Short Term Disability   1/21/2009   10/4/2009
Short Term Disability   4/8/2009    6/14/2009
Short Term Disability   6/19/2009   10/5/2009
Short Term Disability   8/19/2009   12/31/9999
Short Term Disability   5/30/2009   6/18/2009
Short Term Disability   7/9/2009    7/20/2009

第一个日期是他们休假的日期;第二个日期是他们从休假返回的日期。

我试图突破每一行,以便我可以计算该人休假的每个工资期的天数。我们每两周支付2009年第一笔工资,涵盖08年12月14日至2008年12月27日期间,之后每两周增加一次(工资#2涵盖12/28/08至2009年1月10日等)

因此,作为一个例子,我知道第一行数据涵盖了200909到当前支付期间的支付期(我们目前处于支付期200924)。我也知道200910至200924期间应该有10天作为计算数字(因为每个工资有10个工作日),并且200909的支付期计数应该是2(因为该支付期间有2个工作日与时间重叠员工休假。

我想用一个公式来评估它,而不是编写代码。有任何想法吗?提前谢谢。

3 个答案:

答案 0 :(得分:0)

在这里,我做了几个假设:

  1. 请假类型在A栏下。开始和结束日期在B和C栏下。
  2. 行从第1行开始。
  3. 您只关注从2008年12月14日开始的工资期。
  4. 你没有把银行/公共假期考虑在内(尽管把它们带进去了 帐户并不是什么大不了的事。)
  5. 工人的休假包括结束日期。
  6. 我使用了几个单元来解决这个问题:

    • 在单元格D1中:= IF(C1 = DATE(9999,12,31),TODAY(),C1)
    • 在单元格E1中:= B1 - MOD(B1-DATE(2008,12,14),14) - 1
    • 在单元格F1中:= D1 - MOD(D1-DATE(2008,12,14),14) - 1
    • 在单元格G1中:=(F1-E1)/ 14-1
    • 在单元格H1中:=(NETWORKDAYS(E1,B1)+ NETWORKDAYS(F1,D1)+(G1 - 2)* 10)/ G1

    小区D1确定休假是否正在进行。单元格G1计算开始和结束支付期间之间的支付期间数。 Cell H1包含您寻求的答案。

    您可以将这些单元格复制到其他行。另外,如果可行的话,我会考虑用TODAY()代替C列12/31/99。

    <强>已更新

    我注意到如果没有指定结束日期,那么与今天的支付期限相对应的列的值应该是10.此外,我没有确保在第一个支付期间,假期属于,I应该返回该人在该期间休假的天数。考虑到上述因素以及所提供的说明,我提出了以下解决方案。

    我做出与上述相同的假设,只是假设行从第2行开始,假设2被替换。

    我定义了以下名称:

    • FirstPayPeriod:= DATE(2008,12,14)
    • PayPeriodLength:= 14
    • MaxDaysPerPeriod:= NETWORKDAYS(FirstPayPeriod,FirstPayPeriod + PayPeriodLength)
    • NoEndDate:= DATE(9999,12,31)

    我定义了以下单元格并复制了所需的行数:

    • Cell D2:= IF(C2 = NoEndDate,FirstPayPeriod + PayPeriodLength * ROUNDUP((TODAY() - FirstPayPeriod)/ PayPeriodLength,0) - 1,C2)
    • Cell E2:= NETWORKDAYS(B2,D2)

    然后我为第一行定义了以下单元格:

    • Cell F1:= FirstPayPeriod
    • 单元格G1:= F1 + PayPeriodLength

    然后,我将单元格G1复制到列中,以表示我想表示的付费期。当然,单元格F1和右侧的每个后续单元格指定列表示的支付期间的开始日期。

    我最后定义了以下单元格并将其复制到右边的多列中,因为有付费期(除了最后一个付款期限 - 见下文),以及复制到尽可能多的列有数据的行:

    • Cell F2:= IF(OR(G $ 1&lt; = $ B2,F $ 1&gt; $ D2),0,MIN($ E2,NETWORKDAYS(F $ 1,G $ 1 - 1),NETWORKDAYS($ B2, G $ 1),NETWORKDAYS(F $ 1,$ D2)))

    在上一个支付期间,我做了以下事情。假设列AD保存最后一个支付期的数据:

    • Cell AD2:= IF(AC $ 1&gt; $ D2,0,MIN($ E2,NETWORKDAYS(AD $ 1,AD $ 1 + PayPeriodLength - 1),NETWORKDAYS(AC $ 1,$ D2)))

    然后我复制了与数据一样多的行。

答案 1 :(得分:0)

输入以下公式

G1:12/26/2008
G2:=G1+14

并填写第28行。然后

D1:=IF(C1=DATE(9999,12,31),TODAY(),C1)
E1:=NETWORKDAYS(B1,INDEX($G$1:$G$28,MATCH(B1+13,$G$1:$G$28)))
F1:=10-NETWORKDAYS(D1+1,INDEX($G$1:$G$28,MATCH(D1+14,$G$1:$G$28)))

并根据需要填写。然后

H1:{=SUM(($B$1:$B$10<=G1-14)*($D$1:$D$10>G1))}
I1:{=SUM(($B$1:$B$10<G1)*($B$1:$B$10>=G1-14)*($E$1:$E$10))}
J1:{=SUM(($D$1:$D$10>G1-14)*($D$1:$D$10<=G1)*($F$1:$F$10))}
K1:=SUM(H1*10,I1,J1)

请注意,括号括起来的公式需要输入数组 - 不要输入括号,而是使用control + shift + enter提交公式,而不是只输入。

显然,如果您愿意,可以将一堆列组合起来以简洁起见。

答案 2 :(得分:0)

数据透视表方法。输入这些公式

G1:12/26/2008
G2:=G1+14

并填写第28行。然后

A14: Date
A15: 1/21/2009
A16: =A15+1
B14: Count
B15: {=SUM(($B$1:$B$10<=A15)*(WEEKDAY(A15)<7)*(WEEKDAY(A15)>1)*($D$1:$D$10>=A15))}
C14: Week
C15: =INDEX($G$1:$G$28,MATCH(A15+13,$G$1:$G$28))

将A,B和C公式填充到第321行,以便在11/23/09停止(如果需要,可以更远)。

选择A14:C321并创建一个数据透视表。将'Week'放在行区域中,将'Count'放在数据区中。