Excel vba打开csv文件混乱日期格式
我正在使用vba从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
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日”如果是,那么您的原始数据源可能会先格式化几天。如果这些都不正确,而且是多种格式的混合,那么最好的办法就是在输入中强制使用标准格式,这样您就可以强制使用您想要的格式。