计算多个日期范围内的唯一日期

时间:2017-05-09 09:25:44

标签: excel date

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

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

然而,在不同的行之间,期间可以重叠,所以我可以(警告:英国日期格式dd / MM / yy):

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

因为第24行已计入第一行,所以当我得到所有日子的总数时,我不想再计算它。我怎么能实现这个?

提前致谢!

吕西安。

4 个答案:

答案 0 :(得分:1)

长话短说 - 我想不出用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,并将日期保存为集合collDates中的数字,如果它们不存在的话。

答案 1 :(得分:1)

如果您需要每行和每列的总天数,那么您可以始终使用单独的列来添加唯一天数(这假定开始日期是按日期顺序) enter image description here

答案 2 :(得分:0)

如果您在A列中有开始日期,B列中的结束日期和C列中的日期差异,则可以使用D和E列中的以下两个数组公式计算不加倍数(此解决方案不需要提升顺序)。

请注意,这些是数组公式,您必须使用 Ctrl + Shift + 输入来确认它们,而不是仅按下输入 - 键。

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() - 函数是一个新的。

count distinct textjoin

它是如何工作的: 数组公式将开始日期和结束日期之间的所有日期拆分为行,并在连接字符串中将它们作为整数进行搜索,如果匹配,则日期将为"空白" out和其他不同的结果将与之前保存在不断增长的字符串中的不同结果连接在一起。

答案 3 :(得分:0)

制作使用日期列表的另一种方法是使用'筛选'方法,在整个日期范围内(从最早的开始日期到最晚结束日期)生成一个数组,然后填写使用的日期

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

enter image description here

(D栏中的数字刚刚作为支票手动放入,未在计算中使用。)

这显示了数组的样子

enter image description here