Excel函数计算成对日期差异

时间:2016-11-18 15:33:49

标签: excel excel-formula array-formulas

我和我公司的所有员工都有一张excel表。此列表还包括每位员工的病假。我想计算每年的病假。

我的Excel工作表看起来像这样(缩短版):

  A        B            C            D           E           F         G      ...
1 Name     From         To           From        To          From      To     ...
2 Max      2015/06/15   2015/06/16   2016/08/17  2016/08/17  
3 Sarah    2016/01/20   2016/01/20  
4 Phil 
...

说明:马克斯病了两次。首先是2015/06/15至2015/06/16,第二次是2016/08/17至2016/08/17。每当他生病时,桌子就会向右扩展。莎拉只在2016/01/20生病,而菲尔并没有生病。

现在,我想计算一年的病假。 我可以做类似

的事情
   A      B
10 2015   Sum of sick days in 2015
11 2016   Sum of sick days in 2016

所以需要做的是:

  1. 检查日期是否在正确的年份
  2. 成对计算一行中所有日期的网络日,即表示 = 2015年和的SUM(NETWORKDAYS(B2; C2)) = 2016年的SUM(NETWORKDAYS(D2; E2); NETWORKDAYS(B3; C3))。
  3. 但它应该更加动态。我只想选择矩阵,例如每年A1至I8,其余应自动计算。有人知道我该怎么做吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下公式。 (将其粘贴在单元格B10中

=SUMPRODUCT((YEAR($B$2:$N$8)=$A10)*(MOD(COLUMN($B$2:$N$8),2)=0)*(($C$2:$O$8-$B$2:$N$8)+1))

将上述单元格复制到B11中。它应该工作。

答案 1 :(得分:0)

以下似乎非常不守规矩:

=IF(YEAR(C2)=A10,NETWORKDAYS(B2,C2))+IF(YEAR(G2)=A10,NETWORKDAYS(F2,G2))+IF(YEAR(K2)=A10,NETWORKDAYS(J2,K2))+IF(YEAR(C3)=A10,NETWORKDAYS(B3,C3))+IF(YEAR(G3)=A10,NETWORKDAYS(F3,G3))+IF(YEAR(K3)=A10,NETWORKDAYS(J3,K3))+IF(YEAR(C4)=A10,NETWORKDAYS(B4,C4))+IF(YEAR(G4)=A10,NETWORKDAYS(F4,G4))+IF(YEAR(K4)=A10,NETWORKDAYS(J4,K4))

或者,您可以编写一个宏来遍历数据在每个 From To 列之间添加另外两列。 D2将是

=IF(ISBLANK(C2),"",YEAR(C2))

并复制下来。 E2将是

=IF(ISBLANK(C2),"",NETWORKDAYS(B2,C2))

并复制下来。 E11将是

=SUMIF(D2:D4,$A11,E2:E4)

并复制到I11和M11等。然后你可以

=SUM(C11:M11)

如果需要,可以隐藏这些新列。