2009-11-23 126 views
0

我有一个在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年第一次工资,涵盖2008年12月14日至12月27日期间的期间,此后每两周增加一次(第二期工资包括12/28/08至1/10/09等) 。作为一个例子,我知道第一行的数据涵盖了2009年到2009年期间的薪酬期间(我们目前在2009年支付期间)。我也知道200910到2009年的时间应该有10天作为计算的数字(因为每个工资有10个工作日),并且200909支付期的计数应该是2(因为该支付周期中有2个工作日与员工正在休假

我想事先用一个公式来评估这个,而不是编写代码的任何想法感谢

+0

您是否需要考虑银行/公共假期? – 2009-11-23 13:25:49

+0

现在我不打算这样做。我已经构建了一个MEGA嵌套IF,但是我想知道是否有更简单的方法来完成此操作。 – jhc 2009-11-23 16:11:11

回答

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停止在09年11月23日(或更远,如果你想)。

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

+0

谢谢。我会尝试这种方法。 – jhc 2009-11-23 21:13:36

0

在这里,我想提出几个假设:。?。

  1. 请假类型在A列下。开始和结束日期在B和C列下。
  2. 该行开始在第1行中
  3. 你只关心起12月14日支付期,2008年
  4. 你不采取银行/公休日考虑(虽然采取他们到 帐户不是什么大不了的事)。
  5. 工人休假包括结束日期。

我用几个细胞来解决这个问题:

  • 在单元格D1:= IF(C1 = DATE(9999,12,31),TODAY(),C1)
  • 在细胞E1:= B1-MOD(B1-日期(2008,12,14),14) - 1
  • 在单元F1中:= D1-MOD(D1-日期(2008,12,14),14) - 1
  • (网络日(E1,B1)+网络日(F1,D1)+(G1-2)* 10)/ G1中的

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

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

修订

我注意到,如果没有指定结束日期,用于支付期间相应的列中的值今天的日期是属于应该是10。另外,我不保证在第一薪酬期间的假期,我应该返回该人休假的那段时间。考虑到上述因素以及提供的澄清,我提出了以下解决方案。

我使相同的假设如上述,除了假定2被替换为假设行于行2

开始我所定义的名称如下:

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

我定义了以下细胞和复制下来的行的期望数目:

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

我然后定义的以下细胞的顶行:

  • 小区F1:= FirstPayPeriod
  • 细胞G1:= F1 + PayPeriodLength

然后我复制细胞G1跨列尽可能多的支付期我想表示。当然,单元格F1和右边的每个后续单元格都会指定该列表示的付款期间的开始日期。

我终于确定了下面的单元格,并为有支付期复制到尽可能多的列向右(除了最后付款期 - 见下文),以及向下复制到尽可能多的行作为有数据:

  • 小区F2:= IF(OR(G $ 1 < = $ B2,F $ 1> $ D2),0,MIN($ E2,NETWORKDAYS(F $ 1,G $ 1 - 1),NETWORKDAYS( $ B2,G $ 1),NETWORKDAYS(F $ 1,$ D2)))

在最后一段付款期间,我做了以下操作。

  • 细胞AD2:假设列AD最后支付期间保持数据= IF(1 AC $> $ D2,0,MIN($ E2,NETWORKDAYS(AD $ 1,AD $ 1 + PayPeriodLength - 1), NETWORKDAYS(AC $ 1,$ D2)))

然后我复制了多少行数据。

+0

我知道,如果我在第一个薪酬期(本例中为12/14/2008)开始时使用了名称,薪酬期的期限(这里是14)以及代替没有结束日期。 此外,使用VBA编写自定义函数会更加简单,但似乎使用Excel公式是首选。 – 2009-11-23 16:30:11

+0

道歉和澄清。我相信我错误地表达了我想要的状态。 我想要得到的实际结果是每个支付期间,该支付期间的多少天是员工休假?您对所显示数据的假设是正确的 - 第一列是离职类型,第二列是离职开始日期,第三列是离职结束日期。我想要的是这样的(用第一行作为例子): 支付期200909(4/5-4/18)9 所有后续支付期限将等于10(因为休假是正在进行)。 这是否有意义? – jhc 2009-11-23 16:53:23

+0

我明白了。所以我认为你有一组列,每个列代表一个支付期。要找出给定工资期缺勤天数,您需要查看相关专栏。那是对的吗? – 2009-11-23 17:39:50

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) 

注意,公式用方括号括必须阵列进入 - 不要输入括号,而犯了控制+ SHIFT公式+输入,而不是仅仅进入。

显然,如果你喜欢,你可以结合一堆列来简洁。