所以我从计算机生成的CSV文件导入日期。在CSV文件中,日期采用dd / mm / yyyy hh:mm格式。但是当我使用VBA导入它时,VBA将其读取为mm / dd / yyyy hh:mm。所以VBA将2015年1月5日(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
答案 0 :(得分:0)
如果您未指定所有格式详细信息,Excel会在打开文本文件时使用最近使用的Text to Columns
设置。
如果您使用Workbooks.OpenText
方法(而不是Workbooks.Open
方法),则可以指定所有这些格式。尝试在打开文本文件时录制宏,以查看格式的指定方式。
您可以提供的格式之一是日,月和年的顺序。如果找不到有效的格式,可以将该列定义为Text
,然后在后续流程中使用公式解析数据。
答案 1 :(得分:0)
这是一场真正的噩梦......我从来没有找到过简单的&#34;溶液
我的解决方法是,我总是以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