excel - 从字符串输出格式

标签 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 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.52.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/

相关文章:

ios - Swift - 如何在项目中使用资源 excel 文件打开 excel 应用程序? (无法打开文件错误)

excel - 获取具有另一列过滤范围的唯一列表

vba - 在 MS Access 中使用 Application.FileDialog(msoFileDialogSaveAs) 时预设 "save as type"字段

vba - 当单元格为空白并且有许多例程时,如何处理错误

excel - 如何使用 Worksheet_Change 函数找到的表中的值自动填充电子邮件正文

c++ - excel xll :name of the calling function from within function

sql - 从excel导入数据并插入sql表

excel - 比较两行并突出显示不匹配的内容

excel - 我需要在 vba 中解释 activecell.offset

python - 使用 Excel 工作表中的数据替换数据框中的值