【问题标题】:vba open csv file messed date formatvba打开csv文件混乱的日期格式
【发布时间】:2017-12-05 19:10:41
【问题描述】:

我正在使用来自foo.xlsm 文件的vba,打开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"

,所以所有日期都是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代码是这样的:

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 vba csv date


    【解决方案1】:

    如果您使用Workbooks.Open 打开您的 CSV 文件,Excel 会将日期转换为美国格式,除非不可能(因此会尝试其他格式)。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 但我无法提前知道格式是什么,在一般功能中......
      • 也许,但您不能提供所需的格式作为另一个参数吗?您不知道任何给定输入文件的所需格式吗?
      • 如果以 dd-mm-yyyy 格式考虑,这些是否正确? "20/04/2017","01/06/2017","11/09/2017","01/06/2017" 如果是这样,那么您的原始数据源可能会优先格式化。如果这些不正确,并且是多种格式,也许最好的办法是在您的输入中以某种方式强制执行标准格式,以便您可以强制它成为您想要的方式。
      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多