2017-07-02 216 views
1

我使用vba從foo.xlsm文件,打開bar.csv文件,然後將其複製到foo.xlsm文件。然而,令人驚訝的是,事實證明,它會弄亂日期格式,有時識別爲mm/dd/yyyy,受害者dd/mm/yyyyvba打開csv文件搞混日期格式

CSV文件中有一行是這樣的:

"USD/MYR","TRF:1234","20/04/2017","01/06/2017","11/09/2017","01/06/2017" 

,所以所有的日期是在dd/mm/yyyy格式。

如果我打開bar.csv文件手動,4-日期正確地顯示,由於

20/4/2017 1/6/2017 11/9/2017 1/6/2017 

然而,如果從使用VBA打開bar.csv文件foo.xlsm,它被證明是

20/04/2017 6/1/2017 9/11/2017 6/1/2017 

,因此後來複制到foo.xlsm錯誤的日期。

看起來好極了,首先將日期解釋爲mm/dd/yyyy,只有當這不起作用時,纔會將其讀取爲dd/mm/yyyy

VBA代碼是這樣的:

Sub import_via_excel(source_file As String, source_sheet As String, target_sheet As String) 
    On Error GoTo ErrHandler 
    Application.ScreenUpdating = False 

    Set wbThis = ActiveWorkbook 
    Dim dest_sheet As Worksheet 
    Set dest_sheet = wbThis.Sheets(target_sheet) 

    Dim src_book As Workbook 
    Set src_book = Workbooks.Open(source_file, True, True) ' Open in "ReadOnly" mode 
    Dim src_sheet As Worksheet 
    Set src_sheet = src_book.Sheets(source_sheet) 
    src_sheet.Activate 
    last_col = ActiveSheet.UsedRange.Columns.Count 
    last_row = ActiveSheet.UsedRange.Rows.Count 

    Dim row As Integer   ' row counter. 
    Dim col As Integer   ' col counter. 
    Dim src_data As String 
    For row = 1 To last_row 
     For col = 1 To last_col 
      src_data = src_sheet.Cells(row, col).Value 
      dest_sheet.Cells(row, col).Value = src_data 
     Next col 
    Next row 

    src_book.Close False ' close file without saving (FALSE) 
    Set src_book = Nothing 

    wbThis.Activate 

ErrHandler: 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
End Sub 

什麼可能出了問題?

回答

2

如果您使用Workbooks.Open打開您的CSV文件,Excel會將日期轉換爲美國格式,除非不可能(所以它會嘗試其他格式)。

您可以嘗試添加一個參數Local:=True來解決它。

1

因爲它似乎你說的沒錯,Excel正試圖解釋日期爲MM/DD/YYYY第一,只要不工作,它會讀取它爲DD/MM/YYYY:

使用NumberFormat財產強制正確的格式:

For row = 1 To last_row 
    For col = 1 To last_col 
     dest_sheet.Cells(row, col).Select 
     ActiveCell.NumberFormat = "dd-mm-yyyy" 
     src_data = src_sheet.Cells(row, col).Value 
     dest_sheet.Cells(row, col).Value = src_data 
    Next col 
Next row 

試一下,看看是否有幫助,迫使正確的日期格式到每個目的地小區第一。

+0

但我不能提前知道格式是什麼,在一般函數中...... – athos

+0

也許,但是你能不能提供所需的格式作爲另一個參數嗎?你不知道任何給定的輸入文件的所需格式? – TomServo

+0

如果以dd-mm-yyyy格式考慮,這些是正確的嗎? 「2017/04/04」,「2017/01/06」,「2017/11/09」,「2017/01/06」如果是這樣,那麼也許你的原始數據源格式是天爲先。如果這些都不正確,而且這些格式是混合格式,那麼最好的辦法就是以某種方式在您的輸入中強制執行一個標準格式,以便您可以強制它成爲您想要的格式。 – TomServo