我有一些file.csv
。如果我通过双击打开它,它将在Excel中打开并进行适当的设置(没有分号,并且每个"行"数据正确地显示在预期的列中)。
示例结果:
然而,在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:=";"
我已经尝试了上面的行(以及其他一些在我开始保留所有尝试之前)以及根本没有任何参数,但无论我做什么,文件都将打开而文本没有像我双击文件时那样分开。
示例结果:
总结如此;双击文件正确解析文件,Open
和OpenText
没有。令人惊讶的是,无论使用Open
还是OpenText
,工作表看起来都相同。
this question中描述了类似的问题,但仍然没有正确的答案。我们的案例之间的区别在于Excel不会为我解析任何,它似乎会解析OP的大部分文件。
我只想打开工作簿并迭代其中一列,然后关闭它。我有几个解决方法,所以我将能够以不必要的迂回方式解决它。
到目前为止,我已经找到了这些想法:
.csv
重命名为.txt
并使用OpenText
QueryTable
导入OpenText
并使用LEFT
/ MID
/ RIGHT
对所需列进行迭代,对borked文件进行迭代Open
和Split
每行成一个数组所需答案:
Workbooks.OpenText
或类似的原生函数来实现此解决方案。Workbooks.OpenText
和/或与它类似的最合适的本机函数在Excel本身确实能够实现时无法实现所需的结果。答案 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
使Open
和OpenText
能够正确解析文件,即使未指定;
作为分隔符。