此解决方案将使用 excel 中内置的 AGGREGATE、INDEX 和可选的 MINUTE 函数
步骤 1
构建一个唯一 ref ID 列表并将它们放在 D 列中
第二步
使用 AGGREGATE 确定出现 ref ID 的最后一行。
AGGREGATE(16,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1)
AGGREGATE 是一个执行类似数组计算的函数。因此避免在函数中使用完整的列引用。
16 告诉 AGGREGATE 使用 LARGE 公式,因此它将按降序构建一个列表。
6 告诉 AGGREGATE 忽略/排除列表中的任何错误结果。
ROW() 将提取正在评估的行号。
-- 将结果 TRUE 或 FALSE 结果变为 1 或 0。
C2:C16=D2 正在查看该行是否具有 REF ID。
1 告诉 AGGREGATE 返回列表中的第一个数字。
第三步
冲洗,洗涤,重复。确定出现 ref ID 的第一行。
再次像以前一样使用聚合。除了这次不是 LARGE,我们想要找到 SMALL,因此将 16 更改为 15。这将返回 REF ID 第一次出现的行号。
AGGREGATE(15,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1)
第四步
既然您知道要使用的 ROW#,请将行号放入 INDEX 公式中以获取您要使用的单元格。请注意,索引实际上返回单元格地址,因此可以像单元格引用一样使用。
第一次参考
INDEX(B:B,AGGREGATE(16,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1))
上次参考
INDEX(B:B,AGGREGATE(15,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1))
第 5 步
取Last和First之间的区别
INDEX(B:B,AGGREGATE(15,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1))-INDEX(B:B,AGGREGATE(16,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1))
现在,如果第一次引用发生在最后一次引用的时间戳之前,您将得到一个负数。如果您不关心负数,请将整个事物包装在绝对函数中或将结果平方然后平方根。
ABS(INDEX(B:B,AGGREGATE(15,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1))-INDEX(B:B,AGGREGATE(16,6,ROW($A$2:$A$16)/--($C$2:$C$16=D2),1)))
将您选择的上述公式放入E2并根据需要复制下来。
第 6 步
由于您希望在几小时和几分钟内得到答案,因此我选择将信息分成两个单独的列,以便您可以根据需要使用它们。此外,我将引用 E 列中的值,而不是将它们嵌入到以下公式中,如果您想避免额外的列,这也是一种选择。
如果您将 E2 中的结果格式化为一般格式,您会注意到您得到一个整数和一些十进制值。整数表示天数。小数点将 TIME 表示为一天的一小部分。为了得到小时数,你乘以 24,因为一天有 24 小时,然后只取整数。将下面的公式放到F2中并向下复制。
INT(24*E2)
由于您还需要分钟,我们可以使用 MINUTE 函数直接从 E2 中提取这些分钟。将以下内容放在 G2 中并复制下来。
MINUTE(E2)