从字符串输出格式

时间:2016-02-18 20:56:17

标签: excel vba

昨晚我碰到了一些东西,让我疯了十分钟,十五分钟才发现它。但我不明白为什么就是这样,所以我希望有人在这里澄清。

从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中进行了测试。

2 个答案:

答案 0 :(得分:4)

您希望Format将0.5转换为双倍,但它不会。根据{{​​3}},String to Date隐式允许转换

  • 如果是日期/时间,时间或日期(按此顺序),请将其转换为日期。
  • 如果它在Double的范围内,请将其转换为double,然后再转换为日期。
  • 如果两者都没有,则返回错误。

由于它没有转换为double,因此必须在第一个子弹上进行转换。它是。它假设&#34; 0.5&#34;是时候了。根据{{​​3}},小数点是有效的时间分隔符。

time-separator = *WSC (":" / ".") *WSC 

答案 1 :(得分:2)

不同之处在于,您要求VBA格式化DoubleString。您期望VBA以与double值相同的方式解释字符串值。

如果您有一个代表午夜的字符串,则可以是12:00 AM00:00(24小时格式)。 VBA以相同的方式将分隔符解释为:.。因此,对于格式化为午夜后五分钟的String,您可以撰写12:05 AM00.050.50:050:5。另请查看函数CDATE

转换为Double时,所有字符串都会产生相同的结果:

?Cdbl(CDate("00.05"))
 3.472222222222222E-02