打开分号分隔的CSV文件

时间:2009-02-16 16:29:17

标签: vba csv excel-vba excel-2000 excel

如何在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文件中的整行都写入一个单元格,而不是分成单独的分号分隔部分。

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

有什么想法吗?

[2009年2月17日更新]

我尝试使用宏录制器从 user lc 中提出建议。然而,结果令人困惑。

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

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

但是当我在宏中使用该VBA代码时,每一行最终都会在一个单元格中结束。

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

我想知道为什么它正在处理 user Remou 的系统。您有哪些区域和语言设置?

8 个答案:

答案 0 :(得分:3)

[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无法在我的系统上运行,即使它似乎适用于 user Remou 的系统。我想这可能与操作系统语言(英语)以及区域和语言设置(德语,瑞士)有关,但我不确定。

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

答案 1 :(得分:2)

不确定,但您可以尝试录制宏来执行相同的操作并检查它生成的VBA代码。你可能会在那里得到关于缺少什么的提示。

答案 2 :(得分:2)

我发现这在Excel 2000中适用于我:

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

答案 3 :(得分:2)

以下是Excel 2000中的OpenText方法:

  

OpenText方法

     

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

     

<强>语法

     

表达式 .OpenText(文件名,来源,   StartRow,DataType,TextQualifier,   ConsecutiveDelimiter,Tab,Semicolon,   逗号,空间,其他,OtherChar,   FieldInfo,DecimalSeparator,   ThousandsSeparator

     

source

这是Excel 2003版本:

  

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

     

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

     

表达式 .OpenText( FileName,Origin,StartRow,DataType,   TextQualifier,ConsecutiveDelimiter,   标签,分号,逗号,空间,其他,   OtherChar,FieldInfo,   TextVisualLayout,DecimalSeparator,   ThousandsSeparator,   TrailingMinusNumbers,Local

     

source

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

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

  

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

我更喜欢:

Workbooks.Open fileName:=myFilename, UpdateLinks:=False, Local:=True

答案 6 :(得分:0)

通常将逗号勾选为true作为分隔符,通常是小数分隔符。添加DecimalSeparator:=&#34;,&#34;而鲍勃是你的叔叔

答案 7 :(得分:0)

Re任何想法?

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

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

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