Excel 公式或 VBA 识别重叠日期和时间的间隙

问题描述 投票:0回答:2

我正在尝试查找开始和停止日期/时间范围之间以分钟为单位计算的任何间隙。 本质上是日程安排中没有预约的时间,这是 24 小时服务,我正在寻找办公室里没有客户的“死”时间。

目前,我正在尝试使用

=SUMPRODUCT((A2<B$2:B$19)*(B2>A$2:A$19))>1
来查找重叠,我遇到的问题是,如果开始或停止中有任何重叠,则它会取消资格,并且不能真正识别约会之间的空间,只要该约会在全部。

Example image of worksheet

excel vba excel-formula
2个回答
1
投票

这是针对此问题的新版本的 Gap 和 Island 解决方案,使用 Excel 365 功能:

=LET(start,A2:A19,
end,B2:B19,
row,SEQUENCE(ROWS(start)),
maxSoFar,SCAN(0,row,LAMBDA(a,c,IF(c=1,INDEX(start,1),IF(INDEX(end,c-1)>a,INDEX(end,c-1),a)))),
SUM(IF(start>maxSoFar,start-maxSoFar,0)))

算法很简单:

 - Sort data by start time if necessary, then for each pair of times:
 -      Record the latest finish time so far (maxSoFar) (not including the present appointment)
 -      If the start time (start) is greater than maxSoFar, add start-maxSoFar to the total.

第一个时间间隔是一种特殊情况 - 将 maxSoFar 初始化为第一个开始时间。

enter image description here

可以看到预约只有两个间隙,从4:15到7:31(3小时16分钟)和从11:48到14:17(3小时29分钟)总共5小时45分钟。

为什么我不直接使用 Max 来缩短代码呢?我不知道:

=LET(start,A2:A19,
end,B2:B19,
row,SEQUENCE(ROWS(start)),
maxSoFar,SCAN(0,row,LAMBDA(a,c,IF(c=1,INDEX(start,1),MAX(INDEX(end,c-1),a)))),
SUM(IF(start>maxSoFar,start-maxSoFar,0)))

注意

这个答案的前提是数据必须按照开始时间升序排序。如果不是这种情况,您可以添加排序:

=LET(start,SORT(A2:A19),
    end,SORTBY(B2:B7,A2:A19),
    row,SEQUENCE(ROWS(start)),
    maxSoFar,SCAN(0,row,LAMBDA(a,c,IF(c=1,INDEX(start,1),MAX(INDEX(end,c-1),a)))),
    SUM(IF(start>maxSoFar,start-maxSoFar,0)))

0
投票

要查找日程中约会之间的间隔,您可以尝试使用以下公式:

=SUM(B2:B19)-SUMPRODUCT((A2<B$2:B$19)*(B2>A$2:A$19))

然后,您可以将结果乘以 1440(一天中的分钟数),将持续时间转换为分钟。

=1440*(SUM(B2:B19)-SUMPRODUCT((A2<B$2:B$19)*(B2>A$2:A$19)))
© www.soinside.com 2019 - 2024. All rights reserved.