昨晚我遇到了一些事情,让我发疯了整整十、十五分钟,然后我才弄清楚。但我不明白为什么会这样,所以我希望这里有人能解释一下。
从 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 AM 应在 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
我在文档中可以找到的所有内容都表明“时间作为实数的一部分存储。小数点右侧的值代表时间。例如,中午(中午 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 中进行了测试。
最佳答案
您期望 Format
将 0.5 转换为 double ,但事实并非如此。根据https://msdn.microsoft.com/en-us/library/ee198964.aspx ,字符串到日期隐式 let 转换进行
- 如果是日期/时间、时间或日期(按此顺序),请将其转换为日期。
- 如果它在 Double 的范围内,请将其转换为 Double,然后转换为日期。
- 如果两者都不是,则返回错误。
由于它没有转换为 double ,因此它必须在第一个项目符号上进行转换。确实如此。假设“0.5”是一个时间。根据https://msdn.microsoft.com/en-us/library/dn528865.aspx ,小数点是有效的时间分隔符。
time-separator = *WSC (":" / ".") *WSC
关于excel - 从字符串输出格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35492242/