从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格式化DoubleString 。 您期待VBA以与double值相同的方式解释string值。

如果您有一个表示午夜的string,可以是12:00 AM12:00 AM 00:00 (24小时格式)。 VBA将分隔符解释为:. 以相同的方式。 因此,对于格式化为午夜五分钟后的String ,您可以编写12:05 AM00.05 0:5 0:050:5 。 也看CDATE的function。

所有的string在转换为Double给出相同的结果:

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