6

如何在 Excel 2000 中使用 VBA 打开分号分隔的 CSV 文件?

样本数据

An ID;TEST20090222
A Name;Firstname Surname
A Date;11.05.2000

Country:;SomeCountryName
Currency;EUR
CostA;
CostB;
CostC;
Part1;10;20;30
Part2;;;;
Part3;34;56;87

代码

在带有 VBA 6.5.1025 的 Excel 2003 11.8231.8221 SP3 中,我可以使用以下 VBA 代码打开一个以分号分隔的文件:

Workbooks.OpenText filename:=myFilename, _
    DataType:=xlDelimited, Semicolon:=True, Local:=True

但是,当使用 VBA 6.5.1025 在 Excel 2000 9.0.8961 SP1 中运行相同的代码时,出现以下错误:

编译错误:未找到命名参数

那是——我认为——因为 Excel 2000 不知道命名参数“Local”。

因此,我删除了“Local:=True”部分。但问题是 CSV 文件中的一整行被写入一个单元格,而不是被分成单独的分号分隔的部分。

我在互联网上搜索了一个解决方案,但没有找到任何有用和简洁的东西。

有任何想法吗?

[更新 17.02.2009]

我用宏记录器尝试了用户 lc的建议。然而,结果令人困惑。

当我使用菜单 File->Open... 打开 CSV 文件,然后选择 CSV 文件时,分号分隔的数据被正确解析。并且记录的代码很简单:

Workbooks.Open filename:= _
               "D:\testdata\Example 01 CSV\input.csv"

但是当我在宏中使用该 VBA 代码时,每一行都会再次出现在一个单元格中。

根据用户 barrowc的建议,我还将 Windows 的“区域和语言选项”设置从“德语(瑞士)”更改为“英语(美国)”。即使重新启动 Excel,也没有任何改变,同样的问题。

我想知道为什么它在用户 Remou的系统上工作。您有哪些区域和语言设置?

4

8 回答 8

4

[2009 年 2 月 22 日更新]

同时,我通过自己编写导入函数而不是使用 Workbooks.OpenText 解决了这个问题。

我只是将 CSV 文件作为文本文件打开,逐行读取,将每一行拆分为分号分隔的元素,然后将每个元素写入一个单元格。

Sub ImportCSVFile(filepath As String)
    Dim line As String
    Dim arrayOfElements
    Dim linenumber As Integer
    Dim elementnumber As Integer
    Dim element As Variant

    linenumber = 0
    elementnumber = 0

    Open filepath For Input As #1 ' Open file for input
        Do While Not EOF(1) ' Loop until end of file
            linenumber = linenumber + 1
            Line Input #1, line
            arrayOfElements = Split(line, ";")

            elementnumber = 0
            For Each element In arrayOfElements
                elementnumber = elementnumber + 1
                Cells(linenumber, elementnumber).Value = element
            Next
        Loop
    Close #1 ' Close file.
End Sub

从 Shasur 获得灵感:http: //vbadud.blogspot.com/2007/06/vba-read-text-files-with-leading.html

我仍然不知道为什么Workbooks.OpenText不能在我的系统上运行,即使它似乎可以在用户 Remou的系统上运行。我想这可能与操作系统语言(英语)以及区域和语言设置(德语、瑞士)有关,但我不确定。

无论如何,解决方法对我有用。谢谢大家的建议和帮助!

于 2009-03-24T16:27:38.650 回答
2

不确定,但您可以尝试录制一个宏来做同样的事情并检查它产生的 VBA 代码。你可能会得到关于缺少什么的提示。

于 2009-02-16T17:45:42.633 回答
2

我发现这在 Excel 2000 中对我有用:

Workbooks.OpenText filename:=myFilename, _
    DataType:=xlDelimited, Semicolon:=True
于 2009-02-16T18:00:41.503 回答
2

这是OpenTextExcel 2000 中的方法:

开放文本方法

将文本文件加载并解析为新工作簿,其中包含已解析的文本文件数据的单个工作表。

句法

表达式.OpenText(文件名、原点、开始行、数据类型、文本限定符、连续分隔符、制表符、分号、逗号、空格、其他、其他字符、字段信息、小数分隔符、千分隔符

来源

这是 Excel 2003 版本:

OpenText 方法 [Excel 2003 VBA 语言参考]

将文本文件加载并解析为新工作簿,其中包含已解析的文本文件数据的单个工作表。

表达式.OpenText(FileName、Origin、StartRow、DataType、TextQualifier、ConsecutiveDelimiter、Tab、分号、逗号、空格、Other、OtherChar、FieldInfo、TextVisualLayout、DecimalSeparator、ThousandsSeparator、TrailingMinusNumbers、Local

来源

所以Local确实是 Excel 2003 的一个新参数,在 Excel 2000 中不起作用

不知道错误行为的原因。Local参数定义为:

本地 可选变体。如果机器的区域设置应用于分隔符、数字和数据格式,请指定True 。

您可能需要仔细检查 Excel 2000 PC 上的区域设置,并检查是否有任何可能导致数据被错误解释的内容。此外,尝试在 Excel 2000 方法中显式指定DecimalSeparatorThousandsSeparator参数,看看是否有帮助

于 2009-02-16T22:30:42.853 回答
2

另一种解决方法 - 只需将 .csv 文件重命名为 .txt 并使用 OpenText 方法。

于 2010-05-27T14:24:40.947 回答
2

我更喜欢:

Workbooks.Open fileName:=myFilename, UpdateLinks:=False, Local:=True
于 2014-12-08T19:06:02.457 回答
0

通常逗号作为分隔符被勾选为真,它通常是小数分隔符。添加 DecimalSeparator:="," 和 Bob 是你的叔叔

于 2017-07-21T11:57:33.347 回答
0

重新有什么想法吗?

如果您想使用 excel 为其他人修复文件,请在文件的第一行添加此文件,不带引号,后跟换行符:“sep=;”

手动打开愚蠢文件的一种简单方法是将扩展名重命名为 .txt 或 .htm,然后从 excel 中使用 File - Open。

从 VBA 中,我建议在 MSDN 中查找该方法并手动指定每个参数,我的经验是这消除了大多数区域问题。

于 2017-11-04T15:03:49.720 回答