我是 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更多信息SELECT *
简单的预处理(重新排序列,过滤记录,...)。我可以将生成的 ADODB.Recordset 输出到我的工作簿或 无论哪种方式:IMO 与
schema.ini
合作- 文件具有以下优点schema.ini
-file 来处理您的数据。 编辑:这可以提供一个起点。
schema.ini
的新文本文件在存储 csv [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
为了这。 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/