Excel VBA:导入CSV,日期为dd / mm / yyyy

时间:2010-04-14 01:42:53

标签: excel vba csv

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

我在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

10 个答案:

答案 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)

我使用的解决方案是;

  1. 将文件名从.csv更改为.txt,然后再次尝试导入(但听起来这不合适
  2. 更改PC上的区域设置。如果你是英国人,澳大利亚人,新西兰人等,并且通常使用dd / mm / yyyy,那么Windows可能会被错误地安装为美国日期格式等。
  3. 将所有内容作为文本导入然后转换,或者编写一些代码来解析文件。无论哪种方式,您都需要确保获得正确的日期。这是通用日期格式和CDATE()可以帮助您的地方。
  4. 下面的函数读取一个字符串并将其更改为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"