2016-11-29 170 views
0

我是Excel VBA的完全新手。最近,我设法下面的宏安装到我个人的工作簿,以便我可以导入CSV文件的一个按钮,点击(选择必要的选项):通过宏导入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可以将数据识别为日期而不是文本。

我怎样才能确保日期都格式化?这取决于什么?

谢谢!

+0

听起来像问题是与格式,而不是内容或导入。您可以扩展该宏以将日期格式应用于日期列。但要做到这一点,你需要一个系统来识别这些。所有的日期列都包含* date *的字段名称吗? –

回答

2

由于windows本地化(使用默认分隔符,日期和数字格式)很难处理,所以当导入到excel中时,不同的日期格式出了名。

不要乱搞windows本地化只是为了导入一个文件。

当反复导入CSV档案,我用下面的办法:

  1. 我建立schema.ini -file为CSV档案有问题。见this进一步信息

  2. 我要么

    • 查询的CSV文件,SQL和ADODB,它允许简单SELECT *简单的预处理(重新排序列,筛选记录,...) 。我可以将生成的ADODB.Recordset输出到我的工作簿中或者我在工作簿中设置了一个链接表ADODB.Connection。数据可以用一个简单的宏或右击来更新。

无论哪种方式:与schema.ini -files IMO工作具有以下优点

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

编辑:这可以提供一个起点。

  1. 创建您存储您的CSV
  2. 在记事本打开该文件夹名为schema.ini一个新的文本文件(或更好:记事本+ +),粘贴到它

    [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 
    
  3. 调整后如下读enter link description here

    • 文件名
    • 格式(什么分隔符,或者是固定的)
    • DateFormat和/或DateTimeFormat。意识到分钟是nn而不是常见的mm
    • 您想要的列标题和列数据类型。你需要ColNameHeader = FALSE
  4. 在VBA中设置ADO连接,使您可以运行SQL语句并返回ADO记录集。

  5. 运行的SQL语句像这样的

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

  6. 工作,记录

注:你提到的一些混合时小数写入(50:00,0)。只要列中的任何数字都指时间单位,例如几秒或几分钟,宣布字段DateTime-字段没有问题。

不过:如果像00:00,50意味着半分钟,而不是50秒时,可能需要阅读文本,然后用SQL的东西转换它像FORMAT()LEFT()在导入-SQL

+0

感谢您的意见。但我并不是在寻找最佳的工作流程,而是在导入时专门询问通过VBA处理日期格式的可能性。 “数据源和文件连接”是我第一个和本能的方法。但这并不是我所需要的,因为我需要的是能够告诉我的部门同事“嘿,您可以单击我安装在功能区上的这个按钮,并将您自己的数据 - >导入 - >从文本 - >分隔&UTF8->逗号“。我不想教他们Excel,只是帮助他们节省时间。 –

+0

完全有效的点,可以联系! –

0

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

无论如何感谢您的回复。