Excel vba打开csv文件混乱日期格式

Excel vba打开csv文件混乱日期格式,excel,vba,csv,date,Excel,Vba,Csv,Date,我正在使用vba从foo.xlsm文件打开bar.csv文件,然后将其复制到foo.xlsm文件。然而,令人惊讶的是,它会弄乱日期格式,有时识别为mm/dd/yyyy,有时识别为dd/mm/yyyy csv文件的行如下所示: "USD/MYR","TRF:1234","20/04/2017","01/06/2017","11/09/2017","01/06/2017" Sub import_via_excel(source_file As String, source_sheet As Str

我正在使用vba从
foo.xlsm
文件打开
bar.csv
文件,然后将其复制到
foo.xlsm
文件。然而,令人惊讶的是,它会弄乱日期格式,有时识别为
mm/dd/yyyy
,有时识别为
dd/mm/yyyy

csv文件的行如下所示:

"USD/MYR","TRF:1234","20/04/2017","01/06/2017","11/09/2017","01/06/2017"
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
,因此所有日期都是
dd/mm/yyyy
格式

如果我手动打开
bar.csv
文件,4个日期将正确显示,如下所示

20/4/2017   1/6/2017    11/9/2017   1/6/2017
但是,如果从
foo.xlsm
使用vba打开
bar.csv
文件,结果是

20/04/2017  6/1/2017    9/11/2017   6/1/2017
,因此后来复制到
foo.xlsm
错误的日期

excel似乎试图首先将日期解释为
mm/dd/yyyy
,只有当这不起作用时,它才会将其解读为
dd/mm/yyyy

vba代码如下所示:

"USD/MYR","TRF:1234","20/04/2017","01/06/2017","11/09/2017","01/06/2017"
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

出了什么问题?

既然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

尝试一下,看看是否有帮助,首先在每个目标单元格上强制使用正确的日期格式。

因为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

试试看是否有帮助,首先在每个目标单元格上强制使用正确的日期格式。

如果您使用的是
工作簿。打开
要打开您的CSV文件,Excel会将日期转换为US格式,除非这是不可能的(因此它会尝试其他格式)


您可以尝试添加一个参数
Local:=True
来解决此问题。

如果您使用的是
工作簿。Open
要打开您的CSV文件,Excel会将日期转换为US格式,除非这是不可能的(因此它会尝试其他格式)


您可以尝试添加一个参数
Local:=True
,以解决此问题。

但我无法预先知道通用函数中的格式是什么……也许,但您不能提供所需的格式作为另一个参数吗?您不知道任何给定输入文件所需的格式吗?如果以dd-mm-yyyy格式考虑,这些格式正确吗?“2017年4月20日”、“2017年6月1日”、“2017年9月11日”、“2017年6月1日”如果是,那么您的原始数据源可能会先格式化几天。如果这些都不正确,而且这些是多种格式的混合,那么最好的办法可能是在输入中强制使用标准格式,这样您就可以强制它成为您想要的格式。但是我无法预先知道在一般函数中,格式是什么……也许,但您能否将所需的格式作为另一个参数提供?您不知道任何给定输入文件所需的格式吗?如果以dd-mm-yyyy格式考虑,这些格式正确吗?“2017年4月20日”、“2017年6月1日”、“2017年9月11日”、“2017年6月1日”如果是,那么您的原始数据源可能会先格式化几天。如果这些都不正确,而且是多种格式的混合,那么最好的办法就是在输入中强制使用标准格式,这样您就可以强制使用您想要的格式。