【问题标题】:Number of Simultaneous Overlapping datetime(s)同时重叠的日期时间数
【发布时间】:2015-09-10 15:00:05
【问题描述】:

我有两列日期/时间,需要找出在特定时间重叠的最大数量。

用例是这样的:这些是​​电话呼叫的开始时间和结束时间,我正在寻找同时通话的数量。

Column A            Column B                 
8/06/15 00:17:00    8/06/15 00:19:00     
8/09/15 00:20:00    8/09/15 00:30:00     
8/09/15 00:25:00    8/09/15 00:40:00    
8/09/15 00:35:00    8/09/15 00:50:00     
8/09/15 00:45:00    8/09/15 00:55:00     
8/09/15 00:46:00    8/09/15 00:52:00     

预期结果:

Column A            Column B             Max Simultaneous    
8/06/15 00:17:00    8/06/15 00:19:00     0
8/09/15 00:20:00    8/09/15 00:30:00     1
8/09/15 00:25:00    8/09/15 00:40:00     1
8/09/15 00:35:00    8/09/15 00:50:00     2
8/09/15 00:45:00    8/09/15 00:55:00     2
8/09/15 00:46:00    8/09/15 00:52:00     2

我正在尝试的公式是这样的:

=SUMPRODUCT((A$2:A$35006<=B2)*(B$2:B$35006>=A2))

问题在于,它计算了重叠的总数,即使在任何一点它们本身都没有重叠 - 大大增加了预期的结果。

我之前问得不好:

https://stackoverflow.com/posts/32486571/

【问题讨论】:

  • 您能详细说明一下吗?与您的用例相比,我不明白您想要的结果。
  • 通过用例来思考是有帮助的。我有一个电话列表,我正在尝试确定我需要多少条电话线。通话在不同时间开始和结束,当它们重叠时,我需要另一条线。
  • 让我直截了当地说:从 1 到 3 有一个电话,然后从 2 到 4 有另一个电话(所以有一个重叠)。下一个是从 2.5 到 5(3 个重叠)。下一个 6 到 7(不再重叠)。如果是这样,那么您预期结果中的第二行是错误的。
  • 请进一步解释。 Max Simultaneous 计数似乎并不一致,即使在用例中也是如此。
  • 第二行 [00:20:00 到 00:30:00] 与第三行从 00:25:00 到 00:30:00 相交,留下 1 个重叠。第三行 [00:25:00 到 00:40:00] 与第二行相交直到 00:30:00,然后再次与第四行从 00:35:00 开始相交,但由于第二行不相交对于第四行,第三行一次只有 1 个重叠。

标签: excel excel-formula date-range vba


【解决方案1】:

我最终制作了一个 Sub 而不是 UDF。您可以在例程第二行的方括号中设置电话记录的范围。我只用你的六行样本数据对其进行了测试。它将计算最大行数并将它们写入日志右侧的一列(示例中为 C 列)。

Public Sub MaxLines()
    Dim c&, i&, j&, k&, min_#, max_#, n&, v, w&(), vOut, r As Range
    Set r = [a2:b7]
    v = r
    With Application
        min_ = .Min(.Index(r, 0, 1))
        max_ = .Max(.Index(r, 0, 2))
    End With
    n = (max_ - min_) * 1440
    ReDim vOut(1 To UBound(v), 1 To 1)
    ReDim w(1 To n + 1)
    For i = 1 To UBound(v)
        k = (v(i, 1) - min_) * 1440 + 1
        c = CLng((v(i, 2) - v(i, 1)) * 1440)
        For j = 0 To c
            w(j + k) = w(j + k) + 1
        Next
    Next
    For i = 1 To UBound(v)
        k = (v(i, 1) - min_) * 1440 + 1
        c = CLng((v(i, 2) - v(i, 1)) * 1440)
        max_ = 0
        For j = 0 To c
            If w(j + k) > max_ Then max_ = w(j + k)
        Next
        vOut(i, 1) = max_ - 1
    Next
    r.Resize(, 1).Offset(, 2) = vOut
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多