【问题标题】:Trouble with importing a CSV with ws.QueryTables.Add使用 ws.QueryTables.Add 导入 CSV 时遇到问题
【发布时间】:2016-04-06 19:31:47
【问题描述】:

我无法导入 csv 文件。第一行工作正常,但其余的都是靠不住的。这是 csv 中第一行和第二行的示例:

"Order # ","Purchased From (Store)","Purchased On","Bill to Name","Ship to Name","G.T. (Base)","G.T. (Purchased)",Status
202366,"RaD.com
Ra D
Ra D Default View
","Dec 26, 2015 12:07:25 PM","John Smith","John Smith",$70.00,$70.00,Pending

订单号进入正确的单元格,但它将 RaD.com Ra D 和 Ra D 默认视图拆分到不同单元格中的不同行。日期也被分成两个单元格,分别为 [,Dec 19][ 2015 12:07:25 PM"]

这是我正在使用的代码。

Sub ImportCSV(fname)
Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
ws.Name = "temp" & Worksheets.Count + 1


With ws.QueryTables.Add( _
        Connection:="TEXT;" & fname, _
        Destination:=Range("A1"))
    .Name = "Temp" & Worksheets.Count + 1
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = xlMacintosh
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .Refresh BackgroundQuery:=False
    '.UseListObject = False
End With
End Sub

不必完美格式化 RaD.com 单元格,只需将所有内容都放在一个单元格中即可。我无法更改文本文件的格式,因为它们有数千个。

【问题讨论】:

  • IIRC,CSV 格式不允许在单元格值中换行,即使引用。换行符作为行终止符始终覆盖列终止符和引号。
  • 很奇怪,它肯定有一些格式。当我在 excel 中手动打开文档时,它可以正常工作,但是当我使用这种方法导入它时,它不会。刚刚检查了文件类型并确认它是一个 csv。
  • 等等,你为什么把它作为一个查询表打开?将其作为工作簿打开,然后将工作表复制到当前工作簿中,然后在其上定义一个 QueryTable。
  • queryTable 是我唯一能想到的。我该怎么做?我真的只需要将数据复制到当前工作簿中
  • 然后将其作为工作簿打开。我认为它的 Application.Workbooks.Open.

标签: excel vba csv import


【解决方案1】:

我测试了您的 csv 文件,一切正常。只有字段"Purchased From (Store)" 是多行的(如果正确引用,则允许,这里就是这种情况)。

所以你需要一个像.TextFilemultiline 之类的参数。我看看能不能找到。

日期不应该被删减,因为它也被正确引用了:

"Dec 26, 2015 12:07:25 PM"

...

查了QueryTable的参数,多行没找到..奇怪。

但您可能必须将 QueryType 设置为 xlTextImport。否则,您将不得不使用另一种方法。但是多行 csv 肯定是有效的,任何像样的 csv 解析器都不应该有问题。

所以只要它在一个单元格中就可以是多行吗?

是的,如果引用正确:

field1, "field
2
more data
end field2", rest of fields

如果您确实需要使用 QueryTable 执行此操作,您可以尝试使用 ODBC 连接字符串而不是 Connection:="TEXT;"。见here

【讨论】:

  • 所以它可以是多线,只要它在一个单元格中。也许如果我确定日期会起作用。当日期被分割成不同的单元格时,第一个单元格以逗号 [,Dec 19] 开头。逗号可能来自商店。
  • 是的,csv 可以是多行的(虽然还不知道 QueryTables 是否会接受 - 但考虑到所有其他参数,它应该接受。) - 事实上,只要多行不固定,随后的数据也将被错误解析 - 在最后一行:“,”被视为带引号的字段。
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 2011-04-10
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多