从CSV复制数据并将其输出到另一个

时间:2016-08-29 11:02:44

标签: vba excel-vba macros excel

我想做三件事:如果第2列和第3列中的值符合条件,则从一个CSV导入数据,根据映射键转换此数据,并将此转换后的数据输出到新的CSV中。

Sub in_out()



dim file_path as string
file_path = Worksheets("Sheet1").Range("A1").Value
open file_path for input as #1
row_count = 0

sheets("Sheet1").UsedRange.ClearContents
Range("A1").Select

Do Until EOF(1)
    Line Input #1, Line_FromFile
    Line_Items = Split(Line_FromFile, ",")

    If Line_Item(2) = Worksheets("sheet1").Range("B2").Value And Line_Item(3) = Worksheets("sheet1").Range("C2").Value Then


    ActiveCell.Offset(row_count, 0).Value = Line_Items(1)
    ActiveCell.Offset(row_count, 1).Value = Line_Items(2)

    row_count = row_count +1
    Loop

    else
    row_count = row_count +1
    Loop

    end if

    row_count = row_count +1
    Loop




Close #1

End sub

1 个答案:

答案 0 :(得分:3)

您可以考虑将SQL与ADODB-Connection一起使用,而不是仅使用VBA。对于大型CSV,这应该比循环每一行快得多。

像这样的SQL语句可以解决问题。

SELECT * 
INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2

请注意,您需要schema.ini-File来描述CSV的结构。这些设置起来相当简单快捷。

然后你可以

a)直接从MS Access运行所述SQL查询作为MS-Access查询

要么

b)在MS Access-VBA中运行SQL,如下所示:

Dim sql As String
sql = "SELECT * INTO ... FROM ... WHERE ..."
CurrentDb.Execute sql, dbFailOnError
要么

c)如果必须使用Excel,则从Excel-VBA运行它。这将要求您首先设置ADODB.Connection,大致如下:

Dim MyConn As ADODB.Connection
Dim MyCmd As ADODB.Command

With MyConn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Open yourDB.accdb
End With

With MyCmd
    Set .ActiveConnection = MyConn
    .CommandText = strSQL
    .CommandType = adCmdText
    .Execute
End With

Set MyCmd = Nothing
Set MyConn = Nothing

一般说明:

  • 请确保在开发期间备份原始CSV

  • 由于您对每一行(单元格B2和C2)使用相同的过滤条件,因此调整SQL非常简单,可以像读取单元格内容一样完成(在Excel中)或者,例如,使用UserForm(在Access中)。

  • 请注意,在c)中,我首先连接到一个名为yourDB.accdb的ACCDB,这在我的代码中显然毫无意义,因为您可以使用the proper connection string直接连接到文本文件。但是,如果您计划执行某些映射,则可以在所述Access数据库中维护映射表,并在SQL中使用它们(使用Join)。

  • 此外,我个人喜欢在这种情况下,任何路径信息都包含在SQL语句中,即使它的性能稍慢。

编辑: 当然,如果您希望将数据附加到Output-CSV(而不是替换它),您可以使用INSERT - 这样的语句:

INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
SELECT *
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2