Vba 日期间隔并集的大小-excel

Vba 日期间隔并集的大小-excel,vba,excel,Vba,Excel,我有一张Excel表格,上面有大量项目/活动(约10000个)的开始和结束日期。这些项目中有些在时间上重叠,有些则没有。然后我想计算一下至少有一个项目进行了多少天 例: 项目一开始:1月1日。2013年-结束:1月3日。2013年 B项目开始时间:1月2日。2013年-结束:1月4日。2013年 C项目开始时间:1月6日。2013年-结束:1月7日。2013年 一月份至少有一个项目处于活动状态的天数:1,2,3,4,6,7。因此,此类天数总计为6天 由于有数学背景,我会将日期范围合并,并测量

我有一张Excel表格,上面有大量项目/活动(约10000个)的开始和结束日期。这些项目中有些在时间上重叠,有些则没有。然后我想计算一下至少有一个项目进行了多少天

例:

  • 项目一开始:1月1日。2013年-结束:1月3日。2013年
  • B项目开始时间:1月2日。2013年-结束:1月4日。2013年
  • C项目开始时间:1月6日。2013年-结束:1月7日。2013年
一月份至少有一个项目处于活动状态的天数:1,2,3,4,6,7。因此,此类天数总计为6天

由于有数学背景,我会将日期范围合并,并测量其大小。但是,在VBA中似乎没有这样的标准函数,除非间隔是单元格范围,即使这样,它也会对重叠的单元格范围计数两次。有没有干净/快速的解决方案? (日期在我的工作表中以标准excel格式显示)。

请考虑以下事项:

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
Sub CountDays()
将wf设置为工作表函数,将col设置为集合
设置wf=Application.WorksheetFunction
Set col=新集合
变暗起始日期作为范围,结束日期作为范围
尺寸d1为日期,d2为日期,d为日期
暗K一样长
设置起始日期=范围(“C2:C100”)
设置结束日期=范围(“D2:D100”)
d1=wf.Min(起始日期)
d2=wf.Max(结束日期)
对于d=d1至d2
对于K=2到100

如果d>=单元格(K,“C”)和d,这里有一个公式方法:

=SUMPRODUCT(GESTEP(COUNTIFS(C1:C3,"<="&ROW(INDIRECT(MIN(C1:C3)&":"&MAX(D1:D3))),D1:D3,">="&ROW(INDIRECT(MIN(C1:C3)&":"&MAX(D1:D3)))),1))
=SUMPRODUCT(GESTEP(COUNTIFS(C1:C3),“=”和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
函数日期计数(开始日期、结束日期)的长度
暗淡的日期范围,日期频率
应用
DateRange=.Evaluate(“行(&.Min(开始日期)&):“&.Max(结束日期)&”))
DateFreq=.CountIfs(开始日期,.Text(日期范围,“”=“0”))
日期计数=.Sum(.GeStep(DateFreq,1))
以
端函数

哪些列是您的开始和结束日期?当前开始日期在C列,结束日期在D列,但它们可以放在任何地方。谢谢。考虑到一些非常相似的事情,但我认为考虑到日期间隔的数量,这将是非常非常缓慢的。我会尝试实现它,如果它在合理的时间内运行,我会回来接受你的回答:)如果你构建了一个更快的替代方案,请发布它。