【问题标题】:VBA is changing my dates to mm/dd/yyyy hh:mm when importing导入时 VBA 将我的日期更改为 mm/dd/yyyy hh:mm
【发布时间】:2017-05-28 07:11:43
【问题描述】:

所以我从计算机生成的 CSV 文件中导入日期。在 CSV 文件中,日期采用 dd/mm/yyyy hh:mm 格式。但是,当我使用 VBA 导入它时,VBA 将其读取为 mm/dd/yyyy hh:mm。因此 VBA 将 01/05/2015(5 月 1 日)读取为 1 月 5 日。

我检查了,CSV 文件肯定是 dd/mm/yyyy hh:mm 格式。

任何解决此问题的帮助将不胜感激。

所以当我手动打开 CSV 文件时,日期是 dd/mm/yyyy hh:mm 格式。比如 2016 年 12 月 1 日是 01/12/2016 1:00。但是当 VBA 打开它时,它会变为 12/01/2016 1:00。

这是有问题的整个代码。它没有什么复杂的,我无法弄清楚它有什么问题。

Sub import()
    Dim calbook As Workbook
    Dim newwb As Workbook
    Dim destiwb As Workbook
    Dim directory As String
    Dim Filename As String
    directory = "C:\Users\winterco\Desktop\"
    Set calbook = Workbooks("Data_totaliser1.xlsm")
    Filename = Dir(directory & "*.CSV")
    Set newwb = Workbooks.Add
    Set destiwb = ActiveWorkbook
    Do While Filename <> ""
        Workbooks.OpenText (directory & Filename)
        Call Sort_Data(Filename, destiwb, directory, calbook)
        Filename = Dir()  
    Loop  
End Sub

【问题讨论】:

  • 在单元格格式下 --> 数字 --> 日期将区域设置更改为英语(英国)
  • 您好!感谢您的回复。 CSV 文件是计算机生成的。我检查了,日期格式已经设置为英语(新西兰)。

标签: vba excel date datetime


【解决方案1】:

如果您没有指定所有格式详细信息,Excel 在打开文本文件时会使用最近使用的Text to Columns 设置。

如果您使用Workbooks.OpenText 方法(而不是Workbooks.Open 方法),您可以指定所有这些格式。尝试在打开文本文件时录制宏,以查看格式是如何指定的。

您可以提供的格式之一是日、月和年的顺序。如果找不到合适的格式,可以将该列定义为Text,然后在后续过程中使用公式解析数据。

【讨论】:

  • 您好,感谢您的回复!因此,经过仔细检查,当我手动打开 CSV 文件时,日期为 dd/mm/yyyy hh:mm 格式。但是当 VBA 打开它时,它会以某种方式交换日期和月份。例如,当我手动打开它时,示例日期为 01/12/2016 1:00。当 VBA 打开它时,日期变为 12/01/2016 1:00。我没有做任何复杂的事情。我使用了Workbooks.Open (directory &amp; Filename),上面定义了目录和文件名。我一直在尝试使用.OpenText,但它仍然做同样的事情。
  • 使用OpenText时必须指定所有设置,而Open不能指定设置,所以使用OpenText指定所有设置即可。
  • 手动打开时录制宏,您应该会记录所有设置。然后根据需要复制/粘贴。
  • 所以当我录制一个宏打开它时,它只是workbooks.open,并且日期是正确的。但是,当我将那个确切的宏复制到我的代码中时,它会打开文件,并且日期再次以某种方式混淆了。原谅这个愚蠢的问题,但是我如何录制一个宏来做一个.OpenText
  • 您需要使用Data..From Text..ribbon 命令,而不是通常的File..Open..ribbon 命令。或者,也许您正在使用 Office 2007(宏录制在这方面毫无用处)。也许,尝试暂时将文件后缀更改为.txt,记录器可能会使用OpenText 方法。
【解决方案2】:

这真是一场噩梦……我从来没有找到一个“简单”的解决方案。

我的解决方法是我总是用 VBA 作为字符串打开 CSV 来自己进行转换,这样我就不会感到意外。或者如果你想减少它的工作,按照Thunderframe的建议做,作为文本打开,这样没有转换,然后用下面的代码做一个循环:

Dim z: z = VBA.Split(VBA.Replace(x, "-", "/"), "/") 'works with 01/01/2001 and 01-01-2001
answer = DateSerial(Left(z(2), 4), z(1), Left(z(0), 2)) 'left for the case DD/MM/YY 00:00:00, because unlike you I don't give a f* for time of day. If you want the time of the day, you'll need to use :

z=split(x,":")
answer =answer + TimeSerial(right(z(0),2)  , z(1), z(2) ) 'untested code

【讨论】:

  • 您好,谢谢您的回答!我实际上找到了一个非常简单的解决方案,并认为我会分享。问题显然是.Open 不识别除美国以外的任何其他“时间”格式。所以将local:=true 添加到您的代码中,就像这样Workbooks.Open (directory &amp; Filename), local:=True 和繁荣,问题解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
相关资源
最近更新 更多