Excel VBA:导入date为dd / mm / yyy的CSV

我知道这是一个相当普遍的问题,但我还没有find一个可靠的解决scheme。

我有一个csv文件中的第一列格式为dd / mm / yyyy的数据。 当我用Workbooks.OpenText打开它时,默认为mm / dd / yyyy,直到它发现它认为的月份超过12,然后恢复为dd / mm / yyyy。

这是我的testing代码,它试图强制它为xlDMYFormat,我也试过了文本格式。 我知道这个问题只适用于* .csv文件,而不是* .txt,但这不是一个可以接受的解决scheme。

Option Base 1 Sub TestImport() Filename = "test.csv" Dim ColumnArray(1 To 1, 1 To 2) ColumnsDesired = Array(1) DataTypeArray = Array(xlDMYFormat) ' populate the array for fieldinfo For x = LBound(ColumnsDesired) To UBound(ColumnsDesired) ColumnArray(x, 1) = ColumnsDesired(x) ColumnArray(x, 2) = DataTypeArray(x) Next x Workbooks.OpenText Filename:=Filename, DataType:=xlDelimited, Comma:=True, FieldInfo:=ColumnArray End Sub 

test.csv包含:

 Date 11/03/2010 12/03/2010 13/03/2010 14/03/2010 15/03/2010 16/03/2010 17/03/2010 

我有与.OpenText方法相同的问题。 我的区域设置是英语 – 而不是新西兰。 我发现另一个线程,build议使用.open,( http://www.pcreview.co.uk/forums/date-format-error-csv-file-t3960006.html )所以我尝试了Application.Workbooks.Open文件名: = strInPath,格式:= xlDelimited,本地:=真,它的工作。

我有同样的问题。 这是一个函数,将dd / mm / yyyy转换为mm / dd / yyyy。 一次只喂一个date。 希望能帮助到你。

 Function convertDate(x As String) As Date 'convert a dd/mm/yyyy into mm/dd/yyyy' Dim Xmonth Dim XDay Dim XYear Dim SlashLocation Dim XTemp As String XTemp = x SlashLocation = InStr(XTemp, "/") XDay = Left(XTemp, SlashLocation - 1) XTemp = Mid(XTemp, SlashLocation + 1) SlashLocation = InStr(XTemp, "/") Xmonth = Left(XTemp, SlashLocation - 1) XTemp = Mid(XTemp, SlashLocation + 1) XYear = XTemp convertDate = Xmonth + "/" + XDay + "/" + XYear End Function 

意识到这有点晚,但是如果你结合本地和数组限定符,它应该正常工作:

 Workbooks.OpenText Filename:=FileName, _ FieldInfo:=Array(Array(1, 4), Array(2, 1)), Local:=True 

在“Workbooks.OpenText”行的末尾添加Local:= True

 Workbooks.OpenText filename:=filename, DataType:=xlDelimited, Comma:=True, FieldInfo:=ColumnArray, Local:=True 

当我将我的区域更改为英语(NZ)时,这在我的电脑上工作。

编辑:现在我看到别人给出了相同的答案。 🙂

我想阅读一个txt文件,并使用澳大利亚date格式dd/mm/yyyy但我知道如果您打开一个文本文件的Workbooks.Openfunction,您可以将date设置为本地..通过添加Local:=True

防爆

 Workbooks.Open Filename:=VarOpenWorkbook, Local:=True 

这对我有用…

这似乎是伎俩,但仍然是一个黑客。 我将添加一个检查范围中没有date超过一天的时间,以确保正确导入的数据为dd / mm / yyyy不会被反转。

问题仍然是一个解决scheme,而不是一个修补问题的方法。

感谢到目前为止的post。

 Function convertDate(x As String) As Date ' treat dates as mm/dd/yyyy unless mm > 12, then use dd/mm/yyyy ' returns a date value Dim aDate() As String aDate = Split(x, "/") If UBound(aDate) <> 2 Then Exit Function End If If aDate(0) > 12 Then d = aDate(0) m = aDate(1) Else d = aDate(1) m = aDate(0) End If y = aDate(2) d = Lpad(d, "0", 2) m = Lpad(m, "0", 2) If Len(y) = 4 Then Exit Function ' full year expected End If uDate = y & "-" & m & "-" & d & " 00:00:00" convertDate = CDate(uDate) End Function Function Lpad(myString, padString, padLength) Dim l As Long l = Len(myString) If l > padLength Then padLength = l End If Lpad = Right$(String(padLength, padString) & myString, padLength) End Function 

我使用的解决scheme是;

  1. 将文件名从.csv更改为.txt,然后再次尝试导入(但听起来像这是不合适的
  2. 更改PC上的区域设置。 如果你是英语,澳大利亚,新西兰等,通常使用dd / mm / yyyy,那么Windows可能被错误地安装为美国的date格式等。
  3. 将它全部导入为文本,然后转换,或者编写一些代码来parsing文件。 无论哪种方式,你需要确保你得到正确的date。这是通用date格式和CDATE()可以帮助你。

下面的函数读取一个string并将其更改为dd / mm / yyyydate。 尽pipe你必须格式化单元格作为date。 请注意,如果您已经将值作为date导入,这将无济于事。

你可以在代码中使用它或者作为一个函数(UDF)使用它,如果你通过它的模块。

 Function TextToDate(txt As String) As Date Dim uDate As String Dim d, m, y As String Dim aDate() As String aDate = Split(txt, "/") If UBound(aDate) <> 2 Then Exit Function End If d = Lpad(aDate(0), "0", 2) m = Lpad(aDate(1), "0", 2) y = aDate(2) If Len(y) = 2 Then ''# I'm just being lazy here.. you'll need to decide a rule for this. y = "20" & y End If ''# Universal Date format is : "yyyy-mm-dd hh:mm:ss" this ensure no confusion on dd/mm/yy vs mm/dd/yy ''# VBA should be able to always correctly deal with this uDate = y & "-" & m & "-" & d & " 00:00:00" TextToDate = CDate(uDate) End Function Function Lpad(myString As String, padString As String, padLength As Long) As String Dim l As Long l = Len(myString) If l > padLength Then padLength = l End If Lpad = Right$(String(padLength, padString) & myString, padLength) End Function 

这里是代码…我的第一列是DD / MM / YYYYdate,第二列是文本…数组(1,4)是关键…

 Workbooks.OpenText Filename:= _ "ttt.txt", Origin:=437, StartRow _ :=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=True _ , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 4), Array(2, 1)), _ TrailingMinusNumbers:=True 

该值被认为是适当的date…在这之后,您需要将DD / MM / YY的格式应用到第一列。

我刚刚发现的是,你必须把你的本地date分配给variablestypes的Date 。 我不明白为什么它有帮助,但确实如此。

 dim xDate As Date xDate = PresDate.Value ' it is my form object let say it has 03/09/2013 curRange.Value = xDate ' curRange is my cur cell 

在将dd/mm/yyyyxDate它仍然是dd/mm/yyyy ,放入excel后不会改变它。 为什么? 我不知道。 但经过多次尝试,它帮助。 希望这会对很多人有帮助=)

尝试这个:

 Workbooks.OpenText Filename:=Filename, DataType:=xlDelimited, Comma:=True 

Excel应该正确地将这些date值解释为date,即使您更喜欢不同的格式。 执行OpenText方法后,确定哪一列包含date值并更改格式以适合您:

 CsvSheet.Columns(1).NumberFormat = "dd/mm/yyyy"