Excel – 在两个date之间的每个月中统计天数

我正在尝试编写一个可以在一行单元格中拖动的excel公式,以便在两个指定date之间的每个月内给出天数。 例如:

ABCDEF 1 | START DATE | END DATE | Jan | Feb | Mar | Apr |... --------------------------------------------------------- 2 | 10/02/17 | 15/03/17 | 0 | 19 | 15 | 0 |... 

另外一个复杂的情况是,结束date可能会留空,表示结束date应该被视为今天。 我可以把一个公式放在从C2开始的单元格中,但是A和B列必须留给用户input。

我使用大量嵌套的if语句取得了一些进展,但是如果结束date是空白的,我们会遇到麻烦。

任何人都可以帮忙吗?

*编辑

我已经避免performance出我所写的公式,因为恐怕有点混乱,但是现在我已经在下面显示了(C2中的这个公式)

  =IF(AND($A2<C$1,$B2<D$1),DAY(A2),IF($A2>=D$1,0,IF(AND($A2<C$1,$B2=""),IF(TODAY()<C$1,0,IF(TODAY()>C$1,IF(TODAY()<D$1,DAY(TODAY()),D$1-C$1),IF(TODAY()<D$1,INT(TODAY()-$A2),$D1-$C1))),IF(AND($A2>=C$1,$B2=""),IF(TODAY()<D$1,INT(TODAY()-$A2+1),D$1-$A2),IF(AND($A2>=C$1,$B2<D$1),$B2-$A2+1,IF(AND($A2<C$1,$B2<C$1),0,IF(AND($A2>=C$1,$B2>=D$1),D$1-$A2,IF(AND($A2<C$1,$B2<D$1),DAY(B2),IF(AND($A2<C$1,$B2>=D$1),D$1-C$1,0))))))))) 

无论如何,这里是基于标准公式的完整性的替代方法

 =max(0,min(end1,end2)-max(start1,start2)+1) 

为两个date范围之间的重叠给出

 =MAX(0,MIN(IF($B2="",TODAY(),$B2),EOMONTH(DATEVALUE(C$1&"-17"),0))-MAX($A2,DATEVALUE(C$1&"-17"))+1) 

在这里输入图像说明

使用SUMPRODUCT:

 =SUMPRODUCT(--(TEXT(ROW(INDIRECT($A2 & ":" & IF($B2="",TODAY(),B2))),"mmm")=C$1)) 

这将遍历日子,并匹配三个字母的月份的文本到标题。

这假定标题是文本,而不是格式化为mmm的date。

ROW(INDIRECT($A2 & ":" & $B2))与我们可以用公式得到的For循环接近。 它将每次迭代1天。 因为date在excel中以数字forms存储,一天为1我们可以从开始date到结束date迭代。

SUMPRODUCT是一个数组types的公式,它是导致公式循环和计数的原因。

(TEXT(ROW(INDIRECT($A2 & ":" & IF($B2="",TODAY(),B2))),"mmm")=C$1)返回TRUE / FALSE, --将其转换为1/0。

SUMPRODUCT然后添加所有的1/0来得到计数。

在这里输入图像说明


如果标题的date格式为mmm那就用这个代替:

 =SUMPRODUCT(--(MONTH(ROW(INDIRECT($A2 & ":" & IF($B2="",TODAY(),B2))))=MONTH(C$1))) 

在这里输入图像说明