Excel 带时间扩展的倒数计时器
Excel Countdown Timer with Time Extensions
目标:
实现一个倒数计时器,可以在计时器的末尾添加时间扩展。
The layout
对布局的见解:
- 事件 只是与该事件的特定时间相关的事件的下拉列表。 (为此,我们假设它是 50 分钟。)
- Round 1 Start为开始时间,由用户输入。
- Round 1 End是使用excel函数的结束时间。
=IF(ISBLANK(C2),"",IFERROR(C2+VLOOKUP($A,Lookups!$A:$B,2), "Invalid"))
- Remaining Time 是倒数计时器,有一个 excel VBA 可以连续刷新
=IFERROR(IF(NOW()-TODAY()-D2-TIME(0,F2,0)>0,"TIME IN ROUND",IFERROR(ABS((NOW()-TODAY())-D2)+IFERROR(TIME(0,F2,0),0),"")),"")
- Time Extension 是以分钟为单位的延期。
什么有效:
没有时间延长,它会做它应该做的事情,当计时器达到 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>)
等于 x
当 x
为正(或零)时。
所以让我们插入一些数字:
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
。)
目标:
实现一个倒数计时器,可以在计时器的末尾添加时间扩展。
The layout
对布局的见解:
- 事件 只是与该事件的特定时间相关的事件的下拉列表。 (为此,我们假设它是 50 分钟。)
- Round 1 Start为开始时间,由用户输入。
- Round 1 End是使用excel函数的结束时间。
=IF(ISBLANK(C2),"",IFERROR(C2+VLOOKUP($A,Lookups!$A:$B,2), "Invalid"))
- Remaining Time 是倒数计时器,有一个 excel VBA 可以连续刷新
=IFERROR(IF(NOW()-TODAY()-D2-TIME(0,F2,0)>0,"TIME IN ROUND",IFERROR(ABS((NOW()-TODAY())-D2)+IFERROR(TIME(0,F2,0),0),"")),"")
- Time Extension 是以分钟为单位的延期。
什么有效:
没有时间延长,它会做它应该做的事情,当计时器达到 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>)
等于 x
当 x
为正(或零)时。
所以让我们插入一些数字:
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
。)