Vba 日期间隔并集的大小-excel
我有一张Excel表格,上面有大量项目/活动(约10000个)的开始和结束日期。这些项目中有些在时间上重叠,有些则没有。然后我想计算一下至少有一个项目进行了多少天 例: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天 由于有数学背景,我会将日期范围合并,并测量
- 项目一开始:1月1日。2013年-结束:1月3日。2013年
- B项目开始时间:1月2日。2013年-结束:1月4日。2013年
- C项目开始时间:1月6日。2013年-结束:1月7日。2013年
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列,但它们可以放在任何地方。谢谢。考虑到一些非常相似的事情,但我认为考虑到日期间隔的数量,这将是非常非常缓慢的。我会尝试实现它,如果它在合理的时间内运行,我会回来接受你的回答:)如果你构建了一个更快的替代方案,请发布它。