使用VBA打开CSV作为工作表 - 解析不正确

时间:2016-12-06 12:32:16

标签: excel-vba csv vba excel

我有一些file.csv。如果我通过双击打开它,它将在Excel中打开并进行适当的设置(没有分号,并且每个"行"数据正确地显示在预期的列中)。

示例结果:

enter image description here

然而,在VBA中:

'Workbooks.OpenText Filename:=f, StartRow:=2, DataType:=xlDelimited, Semicolon:=True, ConsecutiveDelimiter:=True, TextQualifier:=xlTextQualifierNone
'Workbooks.OpenText Filename:=f, DataType:=xlDelimited, Semicolon:=True
'Workbooks.OpenText Filename:=f, DataType:=xlDelimited
'Workbooks.Open Filename:=f, Format:=xlDelimited, Delimiter:=Chr(34)
'Workbooks.Open Filename:=f, Format:=xlDelimited, Delimiter:=";"
Workbooks.Open Filename:=f, Format:=xlDelimited
Dim s As String
s = """" & ";" & """"
Workbooks.Open Filename:=f, Format:=xlDelimited, Delimiter:=s
'Workbooks.OpenText Filename:=f, DataType:=xlDelimited, OtherChar:=s
'Workbooks.OpenText Filename:=f, DataType:=xlDelimited, OtherChar:=";"

我已经尝试了上面的行(以及其他一些在我开始保留所有尝试之前)以及根本没有任何参数,但无论我做什么,文件都将打开而文本没有像我双击文件时那样分开。

示例结果:

enter image description here

总结如此;双击文件正确解析文件,OpenOpenText没有。令人惊讶的是,无论使用Open还是OpenText,工作表看起来都相同。

this question中描述了类似的问题,但仍然没有正确的答案。我们的案例之间的区别在于Excel不会为我解析任何,它似乎会解析OP的大部分文件。

我只想打开工作簿并迭代其中一列,然后关闭它。我有几个解决方法,所以我将能够以不必要的迂回方式解决它。

到目前为止,我已经找到了这些想法:

  1. .csv重命名为.txt并使用OpenText
  2. 使用QueryTable导入
  3. 使用OpenText并使用LEFT / MID / RIGHT对所需列进行迭代,对borked文件进行迭代
  4. 二进制OpenSplit每行成一个数组
  5. 所需答案:

    1. 如何使用Workbooks.OpenText或类似的原生函数来实现此解决方案。
    2. 解释(或者甚至是想法)关于为什么Workbooks.OpenText和/或与它类似的最合适的本机函数在Excel本身确实能够实现时无法实现所需的结果。
    3. 其他解决方法。

2 个答案:

答案 0 :(得分:3)

如果您要使用VBA导入文件,只需使用VBA解析记录:

Sub ImportFile()
   Dim j As Long, k As Long
    Close #1
    Open "C:\TestFolder\whatever.csv" For Input As #1
    j = 1
     Do While Not EOF(1)
            Line Input #1, TextLine
            ary = Split(TextLine, ";")
            k = 1
            For Each a In ary
               Cells(k, j) = a
               k = k + 1
            Next a
            j = j + 1
    Loop
    Close #1
End Sub

这样做可以阻止VBA为 .csv 扩展名赋予特殊含义。

一旦核心代码令您满意,您可以使用双引号封装等其他功能来装饰它。

答案 1 :(得分:1)

感谢@GarysStudent无意中让我失去了一个我不够聪明的属性。他们说"为.csv扩展名分配特殊含义"。

事实证明,本地化会影响这种特殊含义"在.csv上下文中。我使用的是本地化版本的Excel,并设置Local:=True使OpenOpenText能够正确解析文件,即使未指定;作为分隔符。