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

标签 vba excel 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)。我可以手动选择行内容并将格式更改为长日期,所以至少我确定 excel 将数据识别为日期而不是文本。

如何确保日期的格式都相同?这取决于什么?

谢谢!

最佳答案

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

不要为了导入一个文件而弄乱 Windows 本地化。

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

  • 我设置schema.ini -file 用于有问题的 csv 文件。见 this更多信息
  • 我要么
  • 使用 SQL 和 ADODB 查询 csv 文件,这允许一个简单的 SELECT *简单的预处理(重新排序列,过滤记录,...)。我可以将生成的 ADODB.Recordset 输出到我的工作簿或
  • 我在我的工作簿中设置了一个链接表 ADODB.Connection。可以通过简单的宏或右键单击来更新数据。

  • 无论哪种方式:IMO 与 schema.ini 合作- 文件具有以下优点
  • 允许您处理任何日期和数字格式,而无需调整您的 excel 工作簿或 vba 代码
  • 结构简单透明,可读
  • 一组设置。每个 excel 表或数据库都可以使用相同的 schema.ini -file 来处理您的数据。

  • 编辑:这可以提供一个起点。
  • 创建一个名为 schema.ini 的新文本文件在存储 csv
  • 的文件夹中
  • 在记事本(或更好: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
    
  • 阅读后调整以下enter link description here
  • 文件名
  • 格式(什么分隔符,或者是固定的)
  • 日期格式和/或日期时间格式。意识到分钟是nn而不是常见的mm
  • 您想要的列标题和列数据类型。您需要ColNameHeader = FALSE为了这。
  • 在 VBA 中设置一个 ADO 连接,使您能够运行 SQL 语句并返回 ADO 记录集。
  • 运行这样的 SQL 语句
    SELECT * FROM [Text;DATABASE=C:\Users\yourFolder].yourfile.csv
  • 使用记录集

  • 注:您提到了一些混合时间十进制书写(50:00,0)。只要列中的任何数字指的是时间单位,例如秒或分钟,将字段声明为 DateTime 没有问题- field 。

    但是:如果像 00:00,50表示半分钟而不是 50 秒,可能需要将其作为文本读取,然后使用 SQL 内容(如 FORMAT())进行转换, LEFT()在您的 Import-SQL 中

    关于vba - 通过宏导入 CSV 时日期格式不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40866225/

    相关文章:

    vba - 在 Excel 2010 中使用 Enter 键运行宏,无论工作表是否已更改,在特定范围内按下时

    python - 计算两个 datetime.date() 日期之间的年月差

    javascript - 单元格最后修改日期的函数

    python - 根据内容在word中添加文字

    python将多个excel中的所有工作表附加到pandas数据框中的有效方法

    excel - 如何在3D公式中勾勒出多个列和选项卡的范围?

    java - 如何在 java 的 SimpleDateFormat 中转义单引号

    java - Oracle 时间戳到 BST 时间的转换

    excel - 对象所需错误 Excel VBA

    excel - 有没有办法在 VBA 中更改 Selenium 的 chromedriver 位置?