2016-09-07 50 views
0

我有一組數據(n),大約1500個項目長滿了DD.MM.YYYY格式的日期,而且Excel無法識別。我的目標是將它們改變爲擅長的事情,這就是我的做法。優化日期轉換循環

Function date_to_excel() 
Call public_dims 

Dim date_i As String 
date_array = ThisWorkbook.Sheets("Spread").Range(Cells(7, 5), Cells(7 + n, 5)) 

For i = 0 To n 
date_i = ThisWorkbook.Sheets("Spread").Cells(7 + i, 5) 
    If date_i <> "" Then 
    date_array = Split(date_i, ".") 
    date_i = date_array(1) & "/" & date_array(0) & "/" & date_array(2) 
    ThisWorkbook.Sheets("Spread").Cells(7 + i, 5) = date_i 
    End If 
Next 

End Function 

該函數工作正常,但它只需要很長時間。 我從社區上要求的是如何優化這個循環的想法。我已經嘗試將整個範圍與日期添加到一個數組,並通過查看,但它似乎不與我的方法更改日期格式(date_i =行結束附近)兼容。

+0

也許你可以做一個'Replace'。找到'.'並用'/'替換。 –

+1

如果您將單元格格式設置爲「自定義」並將自定義格式設置爲「dd.mm.yyyy」,則Excel會將單元格中的值識別爲日期 – Zac

+0

@Zac沒有辦法。不工作 –

回答

1

您可以使用帶有DMY列格式的Text To Columns功能。

ThisWorkbook.Sheets("Spread").Range("E7:E" & 7 + n).TextToColumns _ 
           DataType:=xlDelimited, FieldInfo:=Array(1, xlDMYFormat) 
+0

最簡單,最快速 –

+0

超級簡單的解決方案,快速工作,做好工作 - 謝謝你,我將在未來很多時候使用它! –

0

「我曾嘗試添加帶有日期的整個範圍到一個數組,通過尋找」 ......

是的,這是要走的路。一次一個一個地讀取和寫入單元格是需要很多時間的。

Dim vData as Variant 
Dim vDates() as Date 
ReDim vDates(1 to n, 1 to 1) as Date 
Dim i as Long 

vData = ThisWorkbook.Sheets("Spread").Range("E7").Resize(n,1).Value 

For i = 1 to n 
    vDates(i,1) = DateSerial(Split(vData(i,1),".")(2),vData(i,1),".")(1),vData(i,1),".")(0)) 
Next 

ThisWorkbook.Sheets("Spread").Range("E7").Resize(n,1).Value = vDates 
+0

OP在他的代碼中有一個空字符串檢查,但工作正常+1。 – 2016-09-07 13:08:48