CDate承认澳大利亚的日期格式?

时间:2012-09-05 00:15:05

标签: excel excel-vba date vba

我有一个我在8月中旬创建的电子表格,其中有一个表格,从那时起每天都有一列。列标题是日期的日期。日期显示我希望如何显示:“dd / mm / yyyy”

但是,我有一个宏需要读取这些日期才能执行其工作。因为我使用的是表格,所以日期似乎是作为文本而不是5位数字保存(当我将标题单元格的格式设置为“常规”时,它保留为“dd / mm / yyyy”格式而不是改为5位数字。这不是问题,直到9月1日,之后CDate(在宏观中)开始将这些日期读作“mm / dd / yyyy”

有没有办法让CDate认可澳大利亚的日期格式而不是美国?或者失败,使表头保持为日期而不是文本?我宁愿避免将表转换回范围,因为宏被设计为使用表属性,ListColumns等。

更新:

我已经缩小了问题范围。它不是日期,而是ListColumn.Name属性。出于某种原因,它正在重新转换我的约会。我正在使用Format()设置日期格式,如下所示:

CreateHistoryColumn.Name = Format(headerDate, "dd/mm/yyyy")

MsgBox Day(headerDate) & "/" & Month(headerDate) & "/" & Year(headerDate)
MsgBox Format(headerDate, "dd/mm/yyyy")
MsgBox CreateHistoryColumn.Name

其中CreateHistoryCol是类ListColumn的对象。 3个MsgBox调用显示以下内容:

  

2012年6月9日   06/09/2012   2012年9月6日

因此Format()调用会正确格式化日期,但调用ListColumn.Name会将格式更改为“mm / dd / yyyy”。

2 个答案:

答案 0 :(得分:3)

来自帮助文件:

  

CDate 根据系统的区域设置识别日期格式。如果以不同于其中一个识别日期设置的格式提供日期,月份和年份的正确顺序,则可能无法确定。

我讨厌依赖于语言环境,因为大多数时候它似乎与我的预期相反,而且它使代码不那么便携。

我通常尽可能明确地处理日期:

  1. 将您的字符串拆分为各个部分(年,月,日,以及小时,分钟,秒,如果相关)
  2. 将各个部分粘贴在DateSerial功能中。这将返回Date类型。 (如果适用,您可以添加TimeSerial的输出。)
  3. 如果需要显示,请使用Date函数根据需要格式化此Format,该函数返回一个字符串。
  4. Here's a worked example.

答案 1 :(得分:1)

正如我在更新中所示,ListColumn.Name方法负责不需要的转换。我仍然不知道为什么,但有任何简单的解决办法:

CreateHistoryColumn.Name = CLng(headerDate)

这会强制将标题视为数字,因此可以将其标识为正确的日期。我无法解释这一点。