日期格式dd / mm / yyyy读作mm / dd / yyyy

时间:2014-06-16 12:15:16

标签: excel vba

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

  

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

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

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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

即使VBA中的日期格式错误,它似乎在Excel中以正确的方式运行。这很奇怪,我无法解释它为什么会发生,但这对我来说很有用。每当我从VBA转到Excel时,如果将值存储为日期,我几乎总能找到此问题。

答案 2 :(得分:0)

我的这个问题 - .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日和#34;保留为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。

当传输日期涉及到字符串格式的转换时会遇到此错误。我没有发现一个案例,其中从date到string的转换是错误的。这是从字符串到日期的转换,可以解决这个问题。

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

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

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

我更喜欢明确的字符串。 " 2014年6月13日"或者" 2014年6月13日"没有被VBA或人类读者误解。

答案 3 :(得分:0)

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

我发现以下序列可以克服错误解释的日期:

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

    日期采用原始格式

答案 4 :(得分:0)

我发现这个问题非常复杂,并试图让它尽可能简单,但确实留下了一些重要的细节!道歉。这是我发现的更全面的版本:

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

我在Windows 2002上运行的Office 2002

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

我发现的是:

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

将csv中的27/4/2015文本日期字段读入未扩展的变量并以dd / mm / yyyy DATE格式存储到xls字段中,生成一个读取27/4/2015但将其转换为格式化的单元格的单元格由于Number也生成27/4/2015,而2015年7月5日读取2015年5月7日并将其转换为格式为Number的单元格生成42190.

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

因此,上述前3个场景无法为所有日期规范生成所需的结果。

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

Query

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

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

答案 5 :(得分:0)

问题在于VBA正在打开带有倒数日期的csv单位天。

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

type ComponentProps = Pick<Props, Exclude<keyof Props, keyof S | keyof A>>