计算多个date范围内的唯一date

这是我的头脑,所以也许有人可以帮助预防偏头痛? 🙂

我有一张表,其中一列包含开始date和另一个结束date。 我有第三列,计算开始date和结束date之间有多less天(与1添加到它以获得正确的计数,因为开始date等于结束date需要计为一,而不是零)。

但是,不同行之间的时间段可以重叠,所以我可以(警告:英国date格式dd / MM / yy):

Start End Days 22/01/17 26/01/17 5 24/01/17 24/01/17 1 

因为二十四号已经算在第一排,所以当我得到所有天数的总和时,我不想再数一次。 我怎样才能做到这一点?

提前致谢!

吕西安。

如果您需要每个行和每个列的总天数,那么您总是可以有一个单独的列来添加唯一的date(这里假设开始date是按date顺序的) 在这里输入图像说明

长话短说 – 我想不出一个好的和明确的方式来做到这一点与Excel。 但是,用VBA有一个好方法:

 Option Explicit Public Sub TestMe() Dim lngCounter As Long Dim dtStartDate As Date Dim dtEndDate As Date Dim collDates As New Collection dtStartDate = CDate("22.01.2015") dtEndDate = CDate("25.01.2015") For lngCounter = dtStartDate To dtEndDate If Not Contains(collDates, lngCounter) Then collDates.Add lngCounter End If Next lngCounter dtStartDate = CDate("23.01.2015") dtEndDate = CDate("28.01.2015") For lngCounter = dtStartDate To dtEndDate If Not Contains(collDates, lngCounter) Then collDates.Add lngCounter End If Next lngCounter For lngCounter = 1 To collDates.Count Debug.Print CDate(collDates(lngCounter)) Next lngCounter End Sub Public Function Contains(ByRef col As Collection, ByRef key As Variant) As Boolean Dim lngCounter As Long Contains = True For lngCounter = 1 To col.Count If col(lngCounter) = key Then Exit Function Next lngCounter Contains = False End Function 

你给了两次dtStartDatedtEndDate并且把date保存为一个集合collDates数字,如果它们不存在的话。

如果在列A中有开始date,列B中的结束date和列C中的时间差,则可以在列D和E中使用以下两个数组公式计算没有双精度的值(此解决scheme不需要升序)。

请注意,这是数组公式,你必须使用Ctrl + Shift + Enter来确认,而不是只按下Enter键。

D栏:

 =COUNT(IF(ISNUMBER(SEARCH(A2-1+(ROW(INDIRECT("A1:A"&C2))),E1)),"",A2-1+(ROW(INDIRECT("A1:A"&C2))))) 

E栏:

 =TEXTJOIN(",",TRUE,IF(ISNUMBER(SEARCH(A2-1+(ROW(INDIRECT("A1:A"&C2))),E1)),"",A2-1+(ROW(INDIRECT("A1:A"&C2)))),E1) 

你需要Excel 2016,所以你可以达到预期的结果,因为textjoin()函数是一个新的。

统计不同的文本联合

它是如何工作的:数组公式将开始date和结束date之间的所有date分割成行,并将它们作为连接string中的整数进行search,如果匹配,则date将被“空白”,而另一个不同结果将与先前保存在不断增长的string中的不同结果连接起来。

使用date列表的另一种方法是通过在整个date范围(从最早的开始date到最后的结束date)上生成一个数组来使用“sieve”方法,然后填入使用的date

 =SUMPRODUCT(SIGN(COUNTIFS(A2:A10,"<="&ROW(INDIRECT(MIN(A2:A10)&":"&MAX(B2:B10))),B2:B10,">="&ROW(INDIRECT(MIN(A2:A10)&":"&MAX(B2:B10)))))) 

在这里输入图像描述

(D列中的数字刚刚作为支票手动input,不在计算中使用)。

这显示了数组的样子

在这里输入图像说明