从字符串输出格式

Pat*_*nne 6 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
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中进行了测试.

Dic*_*ika 4

您希望Format将 0.5 转换为 double,但事实并非如此。根据https://msdn.microsoft.com/en-us/library/ee198964.aspx, String to Date 隐式 let 转换进行

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

由于它没有转换为双精度数,因此它必须在第一个项目符号上进行转换。确实如此。假设“0.5”是一个时间。根据https://msdn.microsoft.com/en-us/library/dn528865.aspx,小数点是有效的时间分隔符。

time-separator = *WSC (":" / ".") *WSC 
Run Code Online (Sandbox Code Playgroud)