1

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

前任。:

  • 项目 A 开始:2013 年 1 月 1 日 - 结束:2013 年 1 月 3 日
  • 项目 B 开始:2013 年 1 月 2 日 - 结束:2013 年 1 月 4 日
  • 项目 C 开始:2013 年 1 月 6 日 - 结束:2013 年 1 月 7 日

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

来自数学背景,我会合并日期范围并测量它的大小。然而,除非间隔是单元格范围,否则 VBA 中似乎没有这样的标准函数可用,即使那样它也会计算重叠的两次。任何关于干净/快速解决方案的想法?(日期在我的工作表中采用标准 excel 格式)。

4

2 回答 2

1

这是一个公式方法:

=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
于 2013-09-26T15:27:49.343 回答
1

考虑一下:

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 方法禁止将同一日期计算两次。

于 2013-09-26T12:05:11.610 回答