我有一张Excel表格,其中包含大量项目/活动的开始和结束日期(约10,000)。其中一些项目在时间上是重叠的,有些则不是。然后我想计算至少有一个项目正在进行的总天数。
例如:
1月份至少有一个项目目前处于活动状态:1,2,3,4,6,7。因此,这些天的总数是6。
从数学背景出发,我会制作一个日期范围联盟,并确定它的大小。但是,除非间隔是单元格范围,否则VBA中似乎没有这样的标准函数可用,即使这样,它也将重叠两次计算。有关清洁/快速解决方案的任何想法? (日期在我的表格中采用标准的excel格式。)
答案 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