日期间隔联合的大小 - excel

时间:2013-09-26 11:27:03

标签: excel vba excel-vba

我有一张Excel表格,其中包含大量项目/活动的开始和结束日期(约10,000)。其中一些项目在时间上是重叠的,有些则不是。然后我想计算至少有一个项目正在进行的总天数。

例如:

  • 项目A开始时间:2013年1月1日 - 结束日:2013年1月3日
  • 项目B开始时间:2013年1月2日 - 结束日:2013年1月4日
  • Project C Start:jan 6. 2013 - End:jan 7. 2013

1月份至少有一个项目目前处于活动状态:1,2,3,4,6,7。因此,这些天的总数是6。

从数学背景出发,我会制作一个日期范围联盟,并确定它的大小。但是,除非间隔是单元格范围,否则VBA中似乎没有这样的标准函数可用,即使这样,它也将重叠两次计算。有关清洁/快速解决方案的任何想法? (日期在我的表格中采用标准的excel格式。)

2 个答案:

答案 0 :(得分:0)

考虑一下:

Sub CountDays()
    Dim wf As WorksheetFunction, col As Collection
    Set wf = Application.WorksheetFunction
    Set col = New Collection
    Dim StartDates As Range, EndDates As Range
    Dim d1 As Date, d2 As Date, d As Date
    Dim K As Long
    Set StartDates = Range("C2:C100")
    Set EndDates = Range("D2:D100")
    d1 = wf.Min(StartDates)
    d2 = wf.Max(EndDates)
    For d = d1 To d2
        For K = 2 To 100
            If d >= Cells(K, "C") And d <= Cells(K, "D") Then
                On Error Resume Next
                col.Add d, CStr(d)
                On Error GoTo 0
            End If
        Next K
    Next d
    MsgBox col.Count
End Sub

我们循环候选日期,检查它们是否适合任何范围。 Collection.Add方法禁止两次计算相同的日期。

答案 1 :(得分:0)

这是一个公式方法:

=SUMPRODUCT(GESTEP(COUNTIFS(C1:C3,"<="&ROW(INDIRECT(MIN(C1:C3)&":"&MAX(D1:D3))),D1:D3,">="&ROW(INDIRECT(MIN(C1:C3)&":"&MAX(D1:D3)))),1))

和VBA等效的用户定义函数:

Function DateCount(StartDates, EndDates) As Long

Dim DateRange, DateFreq
With Application
    DateRange = .Evaluate("ROW(" & .Min(StartDates) & ":" & .Max(EndDates) & ")")
    DateFreq = .CountIfs(StartDates, .Text(DateRange, """<=""0"), EndDates, .Text(DateRange, """>=""0"))
    DateCount = .Sum(.GeStep(DateFreq, 1))
End With

End Function