【问题标题】:Date format dd/mm/yyyy read as mm/dd/yyyy日期格式 dd/mm/yyyy 读作 mm/dd/yyyy
【发布时间】:2014-06-16 12:15:16
【问题描述】:

我有一个电子表格,其列格式为:

类别:日期
类型:*dd/mm/yyyy
地点:英国

当我通过 VBA 读取此列中的数据时,它以 mm/dd/yyyy 格式读取。

例如,10/06/2014(2014 年 6 月 10 日)正在阅读 06/10/2014(2014 年 10 月 6 日)。

我的代码:sDate = SourceSheet.Range("AB" & CurRow.Row).Value

【问题讨论】:

  • 请问您可以发布代码吗?这可能有助于解决您的问题

标签: excel vba


【解决方案1】:

我的表单也有这个问题,对我来说最好的方法是像这样格式化文本框:

sDate = format(SourceSheet.Range("AB" & CurRow.Row).Value, "mm/dd/yyyy")

即使 VBA 中的日期格式错误,它在 Excel 中似乎也可以正常工作。这很奇怪,我无法解释为什么会发生,但这为我解决了这个问题。每当我从 VBA 转到 Excel 时,如果将值存储为日期,我几乎总是会发现这个问题。

【讨论】:

    【解决方案2】:

    考虑:

    Sub luxation()
        Dim sDate As Date, CurRow As Range
        Set SourceSheet = ActiveSheet
        Set CurRow = Range("A1")
    
        ary = Split(SourceSheet.Range("AB" & CurRow.Row).Text, "/")
        sDate = DateSerial(ary(2), ary(1), ary(0))
    
        MsgBox Format(sDate, "dd mmmm yyyy")
    End Sub
    

    【讨论】:

    • 感谢您的回复。不幸的是,它不起作用。我意识到当我从另一个工作簿读取单元格时会出现问题,即当我在包含日期的工作簿中记录宏时,它会显示正确的日期。但是当我打开工作簿并从另一个包含宏的工作簿中读取日期时,它会失败。但我仍然不知道为什么它失败了!!
    • @Salim 是否给出了错误消息?我希望它会。您是否尝试过将日期部分从字符串实际转换为整数(如 DateSerial 函数所希望的那样)? sDate = DateSerial(CInt(ary(2)), CInt(ary(1)), CInt(ary(0)))
    【解决方案3】:

    我的这个问题 - .NumberFormat sometimes returns the wrong value with dates and times - 提供了一些可能有帮助的背景。

    多年前我第一次遇到这个 VBA 错误,它比看起来更糟糕。我注意到我已经更新了一年的工作表中的许多(但不是全部)日期都是错误的。我花了很长时间来诊断问题。那些可以被解释为中端日期的日期已被破坏,但那些不能被解释为中端日期的日期没有改变。因此 2014 年 6 月 12 日将变为 12 月 6 日,但 2014 年 6 月 13 日仍将是 6 月 13 日。如果 13/06/2014 被拒绝为无效日期或保留为字符串,我会立即发现错误。双重解释,因此每个日期都作为日期导入 - 错误的日期但仍然是日期 - 确保我直到很久以后才注意到,最大限度地提高了纠正错误的成本。

    Excel 将日期和时间保存为数字。 “2014 年 6 月 17 日”为 41807,“1900 年 1 月 1 日”为 1。在这两种情况下,值都是自 1899 年 12 月 31 日以来的天数。作为分数的时间:

    number of seconds since midnight
    --------------------------------
          seconds in a day
    

    所以 06:00、12:00 和 18:00 保持为 0.25、0.5 和 0.75。

    当日期的传输涉及到字符串格式的转换时会遇到此错误。我还没有发现从日期到字符串的转换错误的一个案例。遇到此错误的是从字符串到日期的转换。

    我可以看到 SilverShotBee 的解决方案可以避免该错误,但它不会吸引我。我不再使用任何模棱两可的日期。

    一种选择是将值作为数字传输。如果单元格 A3 包含日期和时间“2014 年 6 月 17 日 9:00”,则 CDbl(Range("A3").Value) 返回 41807.375。当您将此数字存储在单元格中时,您需要将单元格的 NumberFormat 设置为您选择的日期格式,但这可能是件好事。

    如果我要使用中端日期,我会很明确。 #13/06/2014# 总是被解释为中端。

    我更喜欢明确的字符串。 “2014-06-13”或“2014 年 6 月 13 日”不会被 VBA 或人类读者误解。

    【讨论】:

      【解决方案4】:

      刚刚遇到这个问题!从 .csv 读取记录并存储在 .xls 中

      我发现以下顺序可以解决错误解释的日期:

      1. 从 .csv 文件中读取日期字段
      2. 将其存储到 .xls 文件的单元格中
      3. 读回vba
      4. 存储到 .xls 中所需的目标位置

      日期为原始格式

      【讨论】:

      • 欢迎堆栈溢出。您的回答似乎并未完全回答“如何防止 10/06/2014 被解读为 06/10/2014”的问题。您在第 3 步“将其读回 vba”中触及了它,但它需要更详细地说明如何执行此操作以防止问题涵盖的错误。
      【解决方案5】:

      我发现这个问题非常复杂,并试图使其尽可能简单,但确实遗漏了一些重要细节!道歉。这是我发现的更完整的版本:

      首先我应该解释一下我是从 .csv 读取日期(和其他字段)并将其存储回 .xls

      我使用的是在 Windows/7 上运行的 Office 2002

      使用 2 个示例日期:27/4/2015 和 7/5/2015,采用 dd/mm/yyyy 字符串格式(来自 csv)

      我发现的是:

      将 27/4/2015 文本日期字段从 csv 读取到尺寸为 STRING 的变量中并存储到 dd/mm/yyyy DATE 格式的 xls 字段中会生成一个读取 27/4/2015 的单元格,但会将其转换为格式化为数字的单元格也会产生 27/4/2015。另一方面,2015 年 7 月 5 日生成一个字符串,该字符串读取 2015 年 7 月 5 日,并将其转换为格式化为数字的单元格,生成 42131。

      将 27/4/2015 文本日期字段从 csv 读取到无尺寸变量中并以 dd/mm/yyyy DATE 格式存储到 xls 字段中会生成一个读取 27/4/2015 的单元格,但会将其转换为格式化的单元格因为 Number 也会产生 27/4/2015 而 7/5/2015 读取 5/7/2015 并将其转换为格式化为 Number 的单元格会产生 42190。

      将 27/4/2015 文本日期字段从 csv 读取到尺寸为 DATE 的变量中,并以 dd/mm/yyyy DATE 格式存储到 xls 字段中,生成一个读取 27/4/2015 的单元格并将其转换为格式化为 Number 的单元格生成 42121。另一方面,7/5/2015 生成一个字符串,读取 5/7/2015 并将其转换为格式化为 Number 的单元格生成 42190。

      因此,上述前 3 种方案不会为所有日期规范产生预期的结果。

      要解决此问题,我执行以下操作:

      Input_Workbook.Activate
      ilr = Range("A5000").End(xlDown).End(xlDown).End(xlDown).End(xlUp).Row
      For i = 1 To ilr
        Input_Workbook.Activate
        If IsDate(Cells(i, 1).Value) Then
          d1 = Cells(i, 1).Value
          d1 = Replace(d1, "/", "-")
          ThisWorkbook.Activate
          Cells(14, 5).Value = d1
          d1 = Cells(14, 5).Value
          If VarType(d1) = vbString Then
           d1 = CDate(d1)
          End If
          Cells(i, 1).Value = d1
        End If
      Next
      

      最初用于存储日期的单元格格式为 GENERAL,最终目标单元格格式为 DATE (dd/mm/yyyy)。

      我没有足够的脑细胞来完全解释在这个过程中日期发生了什么,但它对我有用,当然目标细胞的选择在上面的代码块中是完全随机的。

      【讨论】:

        【解决方案6】:

        问题是 VBA 正在打开 csv,其中包含一位数天的反向日期。

        这种打开工作簿的方式与我手动打开工作簿的方式相同,因此具有 dd/mm/yyyy 格式的正确日期。然后正确复制:

        Workbooks.OpenText FileName:=fpathO, datatype:=xlDelimited, comma:=True, local:=True
        

        【讨论】:

          猜你喜欢
          • 2016-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多