【问题标题】:CDate to recognise Australian date format?CDate 识别澳大利亚日期格式?
【发布时间】:2012-08-29 16:08:34
【问题描述】:

我有一个我在 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

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

2012 年 6 月 9 日 2012 年 6 月 9 日 2012 年 9 月 6 日

所以Format() 调用正确地格式化了日期,但是对ListColumn.Name 的调用用于将格式更改为“mm/dd/yyyy”。

【问题讨论】:

标签: excel date vba


【解决方案1】:

来自帮助文件:

CDate 根据系统的区域设置识别日期格式。如果提供的格式不是可识别的日期设置之一,则可能无法确定正确的日、月和年顺序。

我讨厌依赖语言环境,因为大多数时候它似乎与我的意图相反,而且它使代码的可移植性降低。

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

  1. 将您的字符串分成不同的部分(年、月、日,以及相关的时、分、秒)
  2. 将各个部分粘贴在DateSerial函数中。这将返回 Date 类型。 (如果适用,您可以添加TimeSerial 的输出。)
  3. 如果出于显示目的需要,请使用返回字符串的Format 函数适当地格式化此Date

Here's a worked example.

【讨论】:

    【解决方案2】:

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

    CreateHistoryColumn.Name = CLng(headerDate)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多