Excel 带时间扩展的倒数计时器

Excel Countdown Timer with Time Extensions

目标:
实现一个倒数计时器,可以在计时器的末尾添加时间扩展。

The layout

对布局的见解:

什么有效:
没有时间延长,它会做它应该做的事情,当计时器达到 0:00:00 时,它会显示“TIME IN ROUND”消息。

什么不起作用: 添加时间扩展后,它永远不会达到 0:00:00,而是开始计数 here。相反,它会在 Time Extension 乘以 2 后显示“TIME IN ROUND”消息。即使在弄乱公式的时间扩展部分后,这对我来说也从来没有正常工作过。

代码分解:
=IF(ISBLANK(C2),"",IFERROR(C2+VLOOKUP($A,Lookups!$A:$B,2), "Invalid"))
这将显示空白,直到开始时间单元格 (C2) 被填满。填写开始时间后,将引用事件以给出持续时间(50 分钟)。

=IFERROR(IF(NOW()-TODAY()-D2-TIME(0,F2,0)>0,"TIME IN ROUND",IFERROR(ABS((NOW()-TODAY())-D2)+IFERROR(TIME(0,F2,0),0),"")),"")
第一个 if 语句,NOW()-TODAY()-D2-TIME(0,F2,0)>0 这只是检查倒数计时器是否已到结束时间。
第二条if语句ABS((NOW()-TODAY())-D2)+IFERROR(TIME(0,F2,0),0)验证是否有时间延长,将时间延长值加到结束时间。

简短回答:

ABS() 就是问题所在。 括号的特殊位置掩盖了问题。

更长的解释:

ABS((NOW()-TODAY())-D2)
    ↑             ↑

标记的括号没有任何用处。 你不妨说

ABS(NOW()-TODAY()-D2)

而且这样说会更清楚

ABS(NOW()-(TODAY()+D2))

其中 TODAY()+D2 是活动的实际(预定)结束时间。 例如,如果 D2 显示为 16:30:00, 实际存储在工作表中的时间为 1900 年 1 月 0 日 16:30:00 (实际上 1899 年 12 月 31 日 16:30:00)。 而且,如果今天是 2021 年 6 月 27 日,那么 TODAY() 就是 2021 年 6 月 27 日 00:00:00, 所以 TODAY()+D2 是 2021 年 6 月 27 日 16:30:00。

因此 NOW()-(TODAY()+D2) 距离实际(预定)结束时间还有多远 事件的时间是从当前时间开始的。 事件的(预定)结束时间之后,这是肯定的。 事件的(预定)结束时间之前,这是负数。 ( 事件的(预定)结束时间,它为零, 正如您对倒数计时器所期望的那样。)

您想显示一个积极的(但不断减少的)时间 在截止日期之前(然后在截止日期 为零, 以及您在截止日期后的“TIME IN ROUND”消息)。 因此,取绝对值具有一定的意义。 但是你得到了错误事物的绝对值。 考虑:如果 D2 是 16:30:00 并且 F2 是 15, 这意味着最后期限真的是 16:45。 现在,让我拿一块稍微大一点的你的公式, 如上所示更改括号,删除 IFERROR 并为清楚起见添加空格:

ABS(NOW()-(TODAY()+D2))   +   TIME(0,F2,0)

16:30之前,这可以正常工作。 NOW()-(TODAY()+D2) 是距离(预定)结束时间(16:30)有多远 从现在开始, 作为 a negative value 向零增加(随着时间的推移)。 因此,绝对值是一个正在减小(向零)的正值。

但是,在 16:30,NOW()-(TODAY()+D2) 变为零, 然后它变成一个递增的正值。 当然,ABS(<i>x</i>) 等于 xx 为正(或零)时。 所以让我们插入一些数字:

NOW() NOW()-(TODAY()+D2) ABS(NOW()-(TODAY()+D2)) ABS(NOW()-(TODAY()+D2)) + TIME(0,F2,0)
     (the countdown value)
16:20 −0:101 0:10 0:25
16:25 −0:051 0:05 0:20
16:30 0:00 0:00 0:15
16:35 0:05 0:05 0:20
16:40 0:10 0:10 0:25
16:45 0:15 0:15 0:30

__________
1 这不是合法的独立值, 因为 Excel 不喜欢负时间。 但是在公式中间没问题。

当然,在 16:45 之后,最外层的 IF 覆盖了所有这些数学内容, 然后您会收到“TIME IN ROUND”消息。

建议

您为什么要查看 TODAY()+D2(或 NOW()-(TODAY()+D2))? 即(原)预定活动结束时间。 您关心活动的延长结束时间(deadline),即

TODAY()+D2+TIME(0,F2,0)

好的,如果 F2 为负数或非数字,TIME(0,F2,0) 会引发错误。 因此,如果存在用户在 F2 中键入“ASAP”之类内容的风险, 你需要用 IFERROR().

来防止这种情况

NOW()-TODAY()-D2-TIME(0,F2,0)>0 很难读懂。 相当于

NOW() > TODAY()+D2+TIME(0,F2,0)

这是(IMO)很容易理解为 “将当前时间与事件的 延长 结束时间进行比较”。 (此外,它还有一个问题:它使用 TIME(0,F2,0) 而没有 IFERROR()。)

公式的右半部分比需要的复杂得多。 我们可以将其简化为

=IF(NOW() > TODAY()+D2+IFERROR(TIME(0,F2,0),0),  "TIME IN ROUND",  (TODAY()+D2+IFERROR(TIME(0,F2,0),0)) - NOW())

但是……

上面有一个 29 个字符的长重复子表达式 (TODAY()+D2+IFERROR(TIME(0,F2,0),0))。 重复的子表达式会影响可读性,尤其是当它们很长时。 extended 事件的结束时间(deadline)是一个有意义的值。 您可能希望将其显示在自己的一列中。 但是,如果不是那样,辅助列怎么样? 放

=TODAY()+D2+IFERROR(TIME(0,F2,0),0)

进入单元格 Z2(并且 frag/fill 向下覆盖列 Z)并使用

=IF(NOW() > Z2,  "TIME IN ROUND",  Z2 - NOW())

E2 中。 (然后您可以根据需要隐藏列 Z。)