从string输出格式
昨天晚上,我遇到了一件事情,在我弄明白之前十五分钟,我已经疯了十几分钟。 但是我不明白为什么会这样,所以我希望有人能够澄清。
从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
从这个页面我看到0.5应该对应于12:00 PM,因为一小时是0.04166 …( (12 * (1/24) = 0.5)
)。 正如你所看到的,如果我将一个数字传递给Format()
而不是如果我将相同的数字作为string传递的话。
根据同一页的信息,1分钟为0.00069444 …( (1/(24*60))
),这意味着12:05 AM应该存储在Excel中0.003472222( (0 * (1/24)) + (5 * (1/(24*60)))
)。 事实上:
?Format(0.003472222, "HH:MM AM/PM") 12:05 AM
我不明白一些更古怪的东西:
?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
我可以在文档中find的所有东西都表示:“Times存储为实数的一部分,小数点右边的值表示时间,例如,中午(12:00 PM)表示为0.5。 (从Excel 2010的内置VBE词汇表)因此, 2.5
应该导致在下午12:00的时间,因为小数点右边的部分是2.523
应该在下午12:33,因为0.523
= (12 * (1/24)) + (33 * (1/(24*60)))
。 但VBA只返回其中一个的正确结果。
那么任何人都可以解释为什么 VBA显示出什么似乎是不一致的行为? 还是有一些我失踪的皱纹?
这在Excel 2010和2013中进行了testing。
您期望Format
将0.5转换为双精度,但它不。 根据https://msdn.microsoft.com/en-us/library/ee198964.aspx ,string到date隐式让转换去
- 如果是date/时间,时间或date(按此顺序),请将其转换为date。
- 如果它在Double的范围内,则将其转换为double,然后再转换为date。
- 如果两者都不是,则返回错误。
由于它不是转换成双精度,所以它必须转换成第一个子弹。 它是。 假设“0.5”是一个时间。 根据https://msdn.microsoft.com/en-us/library/dn528865.aspx ,小数点是一个有效的时间分隔符。
time-separator = *WSC (":" / ".") *WSC
不同之处在于您要求VBA格式化Double
和String
。 您期待VBA以与double值相同的方式解释string值。
如果您有一个表示午夜的string,可以是12:00 AM
或12:00 AM
00:00
(24小时格式)。 VBA将分隔符解释为:
或.
以相同的方式。 因此,对于格式化为午夜五分钟后的String
,您可以编写12:05 AM
, 00.05
0:5
0:05
或0:5
。 也看CDATE
的function。
所有的string在转换为Double
给出相同的结果:
?Cdbl(CDate("00.05")) 3.472222222222222E-02