【问题标题】:VBA: Only import selected columns of a csv fileVBA:仅导入 csv 文件的选定列
【发布时间】:2026-01-23 18:45:01
【问题描述】:

我使用 VBA 将 csv 文件从 Yahoo Finance 导入到 excel 中,其中每行包含 7 个逗号分隔值。我只想导入每行的第一个和第五个逗号分隔值。目前我导入整个 csv,将其提取到列中,然后删除不需要的列。但是,这不足以满足此导入的未来使用。如何选择要导入的列??

当前代码:

qURL = "http://ichart.finance.yahoo.com/table.csv?s=" & Symbol & "&a=" & Month(Startdate) - 1 & "&b=" & Day(Startdate) & _
        "&c=" & Year(Startdate) & "&d=" & Month(Enddate) - 1 & "&e=" & Day(Enddate) & "&f=" & Year(Enddate) & "&g=" & QuoteInterval & "&ignore=.csv"

        With Sheets(2).QueryTables.Add(Connection:="URL;" & qURL, Destination:=ActiveCell.Offset(1, 0))
            .BackgroundQuery = True
            .TablesOnlyFromHTML = False
            .Refresh BackgroundQuery:=False
            .SaveData = True
        End With

            Sheets(2).Range("A2:A" & Lastrow).TextToColumns Destination:=Sheets(2).Range("A2"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=True, Space:=False, other:=False
            Columns(2).EntireColumn.Delete
            Columns(2).EntireColumn.Delete
            Columns(2).EntireColumn.Delete
            Columns(3).EntireColumn.Delete
            Columns(3).EntireColumn.Delete
            Range("A3:A" & Lastrow).NumberFormat = "dd mmm yy"
            Range("B3:B" & Lastrow).NumberFormat = "0.00"

【问题讨论】:

  • 我不确定是否有更好的解决方案,所以我将其作为评论留下,首先从最大索引中删除您的列,如后退。这样,它将使您的列删除更清晰。您不会拥有多个 Columns(2)Columns(3)。只需删除 7,6,4,3,2。

标签: vba excel csv


【解决方案1】:

您可以将数组作为FieldInfo 参数提供给TextToColumns

这将隐藏第 2、3、4、6、7 列

.TextToColumns FieldInfo := Array(Array(1, 1), Array(2, 9), Array(3, 9), Array(4, 9), Array(5, 1), Array(6, 9), Array(7, 9))

1 = xlGeneralFormat
9 = xlSkipColumn

【讨论】:

  • 谢谢,看起来是正确的轨道。但是,无论我在数组中填写什么,此代码都会跳过与数组中从第一列开始的数组数相同的列数。例如,.csv 是:A、B、C、D、E、F、G,使用您提供的代码,它会跳过 A 到 E 列(因为该数组由 5 个数组组成)并将 F 和 G 放在列中.因此,对于一个由 4 个数组组成的数组,它会跳过前 4 列等。我已经尝试了所有可能性,但无论如何它都从第一列开始。
最近更新 更多