【问题标题】:Size of union of date intervals - excel日期间隔联合的大小 - excel
【发布时间】:2013-09-26 11:27:02
【问题描述】:

我有一个 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、2、3、4、6、7。因此,这样的总天数是 6。

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

【问题讨论】:

  • 您的开始日期和结束日期在哪些列中?
  • 当前开始日期在 C 列,结束日期在 D 列,但它们可以放在任何地方。

标签: vba excel


【解决方案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

【讨论】:

    【解决方案2】:

    考虑一下:

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

    【讨论】:

    • 谢谢。考虑了一些非常相似的东西,但考虑到日期间隔的数量,我认为它会非常非常慢。我会尝试实施它,如果它在合理的时间内运行,我会回来接受你的回答:)
    • 如果您构建了一个更快的替代方案,请发布它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多