我知道这是一个相当普遍的问题,但我还没有找到一个可靠的解决方案。
我在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
答案 0 :(得分:5)
我对.OpenText方法有同样的问题。我的区域设置是英语 - 澳大利亚而不是新西兰。 我找到了另一个建议使用.open的线程, (http://www.pcreview.co.uk/forums/date-format-error-csv-file-t3960006.html) 所以我试过了 Application.Workbooks.Open文件名:= strInPath,格式:= xlDelimited,Local:= True 它起作用了。
答案 1 :(得分:3)
我遇到了完全相同的问题。这是将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
答案 2 :(得分:2)
在“Workbooks.OpenText”行的末尾,添加Local:= True
Workbooks.OpenText filename:=filename, DataType:=xlDelimited, Comma:=True, FieldInfo:=ColumnArray, Local:=True
当我将我的地区改为英语(新西兰)时,这在我的电脑上运行。
编辑:现在我看到有人给出了同样的答案。 : - )答案 3 :(得分:1)
我正在尝试读取txt文件并使用澳大利亚日期格式dd/mm/yyyy
但我知道如果您打开带有Workbooks.Open
功能的文本文件,您可以将日期设置为本地..添加Local:=True
实施例
Workbooks.Open Filename:=VarOpenWorkbook, Local:=True
这适合我...
答案 4 :(得分:1)
答案 5 :(得分:0)
我使用的解决方案是;
下面的函数读取一个字符串并将其更改为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
答案 6 :(得分:0)
这似乎可以解决问题,但仍然是一个黑客。我将添加一个检查,确保范围内的日期间隔不超过一天,以确保正确导入的数据为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
答案 7 :(得分:0)
这是代码......我的第一列是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的格式应用于第一列。
答案 8 :(得分:0)
我刚发现的是,您必须将本地日期指定为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后不会更改它。为什么?我不知道。但经过多次尝试,它有所帮助。希望它对许多人有帮助=)
答案 9 :(得分:-1)
试试这个:
Workbooks.OpenText Filename:=Filename, DataType:=xlDelimited, Comma:=True
Excel应该正确地将这些日期值解释为日期,即使您更喜欢不同的格式。执行OpenText方法后,确定哪个列包含日期值并更改格式以使其适合您:
CsvSheet.Columns(1).NumberFormat = "dd/mm/yyyy"