【问题标题】:Excel screws up my dates when system is set to European date format当系统设置为欧洲日期格式时,Excel 搞砸了我的日期
【发布时间】:2014-03-18 00:30:43
【问题描述】:

这就是我正在做的事情: 1.在控制面板中我设置系统日期格式如下:dd/MM/yyyy 2. 我创建了以下简单的宏:

Sub hello()
    ActiveSheet.Cells(1, 1) = "10/01/2014"
End Sub
  1. 我运行它,在单元格 (1,1) 中得到以下日期:01/10/2014

当日期小于 12 时,它将日期转换为美国格式 (MM/dd/yyyy),当日期大于 12 时,它无法转换并正确在单元格中写入日期,但作为文本. 我在尝试从 VSTO 写入日期时首先发现了这一点,但随后将其范围缩小到您将日期从代码写入单元格的任何地方,甚至是宏。 这是Excel错误还是我做错了什么?我正在使用 Excel 2013,但我相信这个问题也存在于所有其他版本中......

【问题讨论】:

  • 旁白:叹息YYYY-MM-DD 一直是避免 mm/dd 或 dd/mm 混淆的标准表示,48 年来en.wikipedia.org/wiki/ISO_2014
  • 谢谢!你让我走上了正轨!

标签: excel vba


【解决方案1】:

VBA 认为所有日期文字都采用美国格式除非文字不可能是有效的美国格式日期。如果您使用"10/Jan/2014"(或#10/Jan/2014##s 是日期文字标记),VBA 将回退到 dd/MMM/yyyy,因为它不能是其他任何东西。

如果您需要 VBA 来理解您的本地日期格式,请使用:

Sub hello()
    ActiveSheet.Cells(1, 1) = DateValue("10/01/2014")
End Sub

...因为(如 VBA 帮助文件中所述):

DateValue 识别月、日、年的顺序 您为系统指定的短日期格式。日期值也 识别包含月份名称的明确日期,无论是长 或缩写形式。

因此,只要您的 PC 设置了正确的区域设置,DateValue() 就应该能够理解您的首选日期格式。

【讨论】:

  • 谢谢,VBA 解决了!但是,我的问题不在 VBA 中,而是在 VSTO 中,我正在使用 Range.set_Values(array) 方法将日期写入一系列单元格。有没有办法在 C# 代码中使用类似于 DateValue() 的东西?
  • 查看 msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx 的 DateTime 构造函数和 ParseParseExact
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2010-09-23
相关资源
最近更新 更多