簡體   English   中英

Excel VBA:導入CSV,日期為dd / mm / yyyy

[英]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/yyyyxDate它仍然是dd/mm/yyyy並且在將其放入excel后不會改變它。 為什么? 我不知道。 但經過多次嘗試,它有所幫助。 希望它對很多人有幫助=)

我使用的解決方案是;

  1. 將文件名從.csv更改為.txt,然后再次嘗試導入(但聽起來這不合適
  2. 更改PC上的區域設置。 如果你是英國人,澳大利亞人,新西蘭人等,並且通常使用dd / mm / yyyy,那么Windows可能會被錯誤地安裝為美國日期格式等。
  3. 將它全部作為文本導入然后轉換,或者編寫一些代碼來解析文件。 無論哪種方式,您都需要確保獲得正確的日期。這是通用日期格式和CDATE()可以幫助您的地方。

下面的函數讀取一個字符串並將其更改為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM