通过宏导入CSV时,日期格式不一致

时间:2016-11-29 12:42:16

标签: excel vba excel-vba date csv

我是Excel VBA的完全新手。我最近设法将以下宏安装到我的个人工作簿中,以便我可以通过单击按钮导入CSV文件(选择必要的选项):

Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

有效。但是,它不能始终如一地工作。我将它用于不同的CSV文件(所有这些都在ISO 8601日期系统中预先格式化),但我得到了不同的结果。在其中一些日期输出是DD / MM / YYYY hh:mm,但在其他情况下,这是我无法理解的奇怪的东西(如00:00,0或50:00,0)。我可以手动选择行内容并将格式更改为long-date,所以至少我确信excel会将数据识别为日期而不是文本。

如何确保日期格式均等?这取决于什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

导入到Excel时,不同的日期格式是众所周知的,因为Windows本地化(使用默认分隔符,日期和数字格式)可能很难处理。

只要导入一个文件,就不要搞乱Windows本地化。

重复导入csv-Files时,我使用以下方法:

  1. 我为有问题的csv-Files设置了schema.ini - 文件。有关详细信息,请参阅this

  2. 我要么

    • 使用SQL和ADODB查询csv-File,这允许简单的SELECT *简单预处理(重新排序列,过滤记录,......)。我可以将生成的ADODB.Recordset输出到我的工作簿中

    • 我在工作簿中设置了一个ADODB.Connection的链表。可以使用简单的宏或右键单击更新数据。

  3. 无论哪种方式:IMO使用schema.ini - 文件具有以下优势

    • 允许您处理任何日期和数字格式,而无需调整Excel工作簿或vba代码
    • 结构简单透明,可读
    • 一组设置。每个excel表或数据库都可以使用相同的schema.ini文件来处理您的数据。

    修改:这可以提供一个起点。

    1. 在存储csv
    2. 的文件夹中创建名为schema.ini的新文本文件
    3. 在记事本中打开(或更好:Notepad ++),将其粘贴到其中

      [yourfile.csv]
      CharacterSet = ANSI
      ColNameHeader = FALSE
      Format = Delimited(;)
      DateFormat = "DD.MM.YYYY"
      DateTimeFormat = "DD.MM.YYYY hh:nn,ss"
      Col1 = yourdatefield DateTime
      Col2 = somelongfield Long
      
    4. 阅读enter link description here

      后调整以下内容
      • 文件名
      • 格式(分隔符,或是否已修复)
      • DateFormat和/或DateTimeFormat。确认会议记录为nn而非公共mm
      • 您想要的列标题和列数据类型。您需要ColNameHeader = FALSE
    5. 在VBA中设置ADO-Connection,使您能够运行SQL语句并返回ADO记录集。

    6. 运行像这样的SQL语句

      SELECT * FROM [Text;DATABASE=C:\Users\yourFolder].yourfile.csv

    7. 使用记录集

    8. 注意:你提到了一些混合的时间 - 小数写作(50:00,0)。只要列中的任何数字指的是时间单位,例如秒或分钟,将字段声明为DateTime - 字段没有问题。

      但是:如果00:00,50之类的内容意味着半分钟而不是50秒,则可能需要将其作为文本阅读,然后使用FORMAT()LEFT()之类的SQL内容进行转换在Import-SQL

答案 1 :(得分:0)

已解决:问题不在于Excel,而在于为我提供CSV文件的服务。显然,他们有两个选项可以从他们的网站下载CSV,并且他们的日期格式不同。其中一个正确使用ISO-8601,但另一个正在添加" .0"在日期字符串的末尾,所以Excel翻转并将其视为文本字符串。

感谢所有人的回复。