昨晚我碰到了一些东西,让我疯了十分钟,十五分钟才发现它.但我不明白为什么会这样,所以我希望有人可以解释.
从VBA IDE中的立即窗口:
?Format(0.5, "HH:MM AM/PM")
12:00 PM
?Format("0.5", "HH:MM AM/PM")
12:05 AM
?Format(CDbl("0.5"), "HH:MM AM/PM")
12:00 PM
Run Code Online (Sandbox Code Playgroud)
从这个页面我看到0.5应该对应于12:00 PM,因为一小时是0.04166 ...((12 * (1/24) = 0.5)
).正如你所看到的,如果我传递一个数字,Format()
但是如果我传递与字符串相同的数字则不会.
根据同一页面的信息,1分钟为0.00069444 ...((1/(24*60))
),意味着上午12:05应存储在Excel中为0.003472222((0 * (1/24)) + (5 * (1/(24*60)))
).事实上:
?Format(0.003472222, "HH:MM AM/PM")
12:05 AM
Run Code Online (Sandbox Code Playgroud)
更奇怪的是我不明白:
?Format(2.5, "HH:MM AM/PM")
12:00 PM
?Format("2.5", "HH:MM AM/PM")
02:05 AM
Run Code Online (Sandbox Code Playgroud)
但...
?Format(2.523, "HH:MM AM/PM")
12:33 PM
?Format("2.523", "HH:MM AM/PM")
12:33 PM
Run Code Online (Sandbox Code Playgroud)
我在文档中找到的所有内容都表示"时间存储为实数的一部分.小数点右侧的值表示时间.例如,中午(中午12:00)表示为0.5." (来自Excel 2010的内置VBE词汇表)因此,2.5
应该导致12:00 PM的时间,因为小数点右边的部分是,0.5
并且2.523
应该在12:33 PM之后导致0.523
= (12 * (1/24)) + (33 * (1/(24*60)))
.但是VBA只返回其中一个的正确结果.
那么有人可以解释为什么 VBA表现出看似不一致的行为吗?还是有些皱纹我不见了?
这在Excel 2010和2013中进行了测试.
您希望Format
将 0.5 转换为 double,但事实并非如此。根据https://msdn.microsoft.com/en-us/library/ee198964.aspx, String to Date 隐式 let 转换进行
由于它没有转换为双精度数,因此它必须在第一个项目符号上进行转换。确实如此。假设“0.5”是一个时间。根据https://msdn.microsoft.com/en-us/library/dn528865.aspx,小数点是有效的时间分隔符。
time-separator = *WSC (":" / ".") *WSC
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
111 次 |
最近记录: |