我是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会将数据识别为日期而不是文本。
如何确保日期格式均等?这取决于什么?
谢谢!
答案 0 :(得分:2)
导入到Excel时,不同的日期格式是众所周知的,因为Windows本地化(使用默认分隔符,日期和数字格式)可能很难处理。
只要导入一个文件,就不要搞乱Windows本地化。
重复导入csv-Files时,我使用以下方法:
我为有问题的csv-Files设置了schema.ini
- 文件。有关详细信息,请参阅this
我要么
使用SQL和ADODB查询csv-File,这允许简单的SELECT *
简单预处理(重新排序列,过滤记录,......)。我可以将生成的ADODB.Recordset输出到我的工作簿中
我在工作簿中设置了一个ADODB.Connection的链表。可以使用简单的宏或右键单击更新数据。
无论哪种方式:IMO使用schema.ini
- 文件具有以下优势
schema.ini
文件来处理您的数据。修改:这可以提供一个起点。
schema.ini
的新文本文件
在记事本中打开(或更好: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
nn
而非公共mm
ColNameHeader = FALSE
。在VBA中设置ADO-Connection,使您能够运行SQL语句并返回ADO记录集。
运行像这样的SQL语句
SELECT * FROM [Text;DATABASE=C:\Users\yourFolder].yourfile.csv
使用记录集
注意:你提到了一些混合的时间 - 小数写作(50:00,0
)。只要列中的任何数字指的是时间单位,例如秒或分钟,将字段声明为DateTime
- 字段没有问题。
但是:如果00:00,50
之类的内容意味着半分钟而不是50秒,则可能需要将其作为文本阅读,然后使用FORMAT()
,LEFT()
之类的SQL内容进行转换在Import-SQL
答案 1 :(得分:0)
已解决:问题不在于Excel,而在于为我提供CSV文件的服务。显然,他们有两个选项可以从他们的网站下载CSV,并且他们的日期格式不同。其中一个正确使用ISO-8601,但另一个正在添加" .0"在日期字符串的末尾,所以Excel翻转并将其视为文本字符串。
感谢所有人的回复。