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.Open
function,您可以将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是;
- 将文件名从.csv更改为.txt,然后再次尝试导入(但听起来像这是不合适的
- 更改PC上的区域设置。 如果你是英语,澳大利亚,新西兰等,通常使用dd / mm / yyyy,那么Windows可能被错误地安装为美国的date格式等。
- 将它全部导入为文本,然后转换,或者编写一些代码来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/yyyy
为xDate
它仍然是dd/mm/yyyy
,放入excel后不会改变它。 为什么? 我不知道。 但经过多次尝试,它帮助。 希望这会对很多人有帮助=)
尝试这个:
Workbooks.OpenText Filename:=Filename, DataType:=xlDelimited, Comma:=True
Excel应该正确地将这些date值解释为date,即使您更喜欢不同的格式。 执行OpenText方法后,确定哪一列包含date值并更改格式以适合您:
CsvSheet.Columns(1).NumberFormat = "dd/mm/yyyy"