昨晚我碰到了一些东西,让我疯了十分钟,十五分钟才发现它。但我不明白为什么就是这样,所以我希望有人在这里澄清。
从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
从this page我看到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
我不明白的一些奇怪之处:</ p>
?Format(2.5, "HH:MM AM/PM")
12:00 PM
?Format("2.5", "HH:MM AM/PM")
02:05 AM
但是...
?Format(2.523, "HH:MM AM/PM")
12:33 PM
?Format("2.523", "HH:MM AM/PM")
12:33 PM
我在文档中找到的所有东西都说&#34;时间存储为实数的一部分。小数点右侧的值表示时间。例如,正午(下午12:00)由0.5表示。&#34; (来自Excel 2010的内置VBE词汇表)所以2.5
应该会产生12:00 PM的时间,因为小数点右边的部分是0.5
和{{1}应该在2.523
= 0.523
之后的12:33结果。但是VBA只返回其中一个的正确结果。
所以任何人都可以解释为什么 VBA表现出看似不一致的行为?或者是否有一些我不知道的皱纹?
这在Excel 2010和2013中进行了测试。
答案 0 :(得分:4)
您希望Format
将0.5转换为双倍,但它不会。根据{{3}},String to Date隐式允许转换
由于它没有转换为double,因此必须在第一个子弹上进行转换。它是。它假设&#34; 0.5&#34;是时候了。根据{{3}},小数点是有效的时间分隔符。
time-separator = *WSC (":" / ".") *WSC
答案 1 :(得分:2)
不同之处在于,您要求VBA格式化Double
和String
。您期望VBA以与double值相同的方式解释字符串值。
如果您有一个代表午夜的字符串,则可以是12:00 AM
或00:00
(24小时格式)。 VBA以相同的方式将分隔符解释为:
或.
。因此,对于格式化为午夜后五分钟的String
,您可以撰写12:05 AM
,00.05
,0.5
,0:05
或0:5
。另请查看函数CDATE
。
转换为Double
时,所有字符串都会产生相同的结果:
?Cdbl(CDate("00.05"))
3.472222222222222E-02