[英]Excel VBA: importing CSV with dates as dd/mm/yyyy
我知道這是一個相當普遍的問題,但我還沒有找到一個可靠的解決方案。
我在csv文件中有數據,第一列格式為dd / mm / yyyy。 當我用Workbooks.OpenText打開它時,它默認為mm / dd / yyyy,直到它發現它認為月份超過12,然后恢復到dd / mm / yyyy。
這是我的測試代碼,試圖將其強制為xlDMYFormat,我也嘗試了文本格式。 我知道這個問題只適用於* .csv文件,而不適用於* .txt,但這不是一個可接受的解決方案。
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方法有同樣的問題。 我的區域設置是英語 - 澳大利亞而不是新西蘭。 我找到另一個建議使用.open,( http://www.pcreview.co.uk/forums/date-format-error-csv-file-t3960006.html )的帖子,所以我嘗試了Application.Workbooks.Open文件名: = strInPath,格式:= xlDelimited,Local:= True,它工作正常。
我有同樣的問題。 這是將dd / mm / yyyy轉換為mm / dd / yyyy的函數。 只需一次輸入一個日期。 希望能幫助到你。
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”行的末尾,添加Local:= True
Workbooks.OpenText filename:=filename, DataType:=xlDelimited, Comma:=True, FieldInfo:=ColumnArray, Local:=True
當我將我的地區改為英語(新西蘭)時,這在我的電腦上運行。
編輯:現在我看到別人給出了同樣的答案。 :-)
我試圖讀取一個txt文件並使用澳大利亞日期格式dd/mm/yyyy
但我知道如果你打開一個帶有Workbooks.Open
函數的文本文件,你可以將日期設置為local ..通過添加Local:=True
防爆
Workbooks.Open Filename:=VarOpenWorkbook, Local:=True
這對我有用......
意識到這有點晚了,但如果你結合本地和數組限定符它應該正常工作:
Workbooks.OpenText Filename:=FileName, _
FieldInfo:=Array(Array(1, 4), Array(2, 1)), Local:=True
我剛發現的是,您必須將本地日期分配給可變類型的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后不會改變它。 為什么? 我不知道。 但經過多次嘗試,它有所幫助。 希望它對很多人有幫助=)
我使用的解決方案是;
下面的函數讀取一個字符串並將其更改為dd / mm / yyyy日期。 您必須將單元格格式化為日期。 請注意,如果您已將值導入為日期,則無效。
您可以在代碼中使用它,也可以將其作為函數(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 / yyyy不會反轉。
對於解決方案仍然存在問題,而不是修補問題的方法。
感謝迄今為止的帖子。
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
這是代碼......我的第一列是DD / MM / YYYY日期,第二列是文本......數組(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
該值被識別為正確的日期......此后,您需要將DD / MM / YY的格式應用於第一列。
嘗試這個:
Workbooks.OpenText Filename:=Filename, DataType:=xlDelimited, Comma:=True
即使您更喜歡不同的格式,Excel也應該正確地將這些日期值解釋為日期。 執行OpenText方法后,確定哪個列包含日期值並更改格式以使其適合您:
CsvSheet.Columns(1).NumberFormat = "dd/mm/yyyy"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.