簡體   English   中英

日期間隔的並集大小-Excel

[英]Size of union of date intervals - excel

我有一張包含大量項目/活動(大約10,000個)的開始和結束日期的Excel工作表。 其中一些項目在時間上重疊,而有些則沒有。 然后,我想計算至少一個項目正在進行多少天。

例如:

  • 項目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格式)。

考慮一下:

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方法禁止將同一日期計數兩次。

這是一種公式方法:

=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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM