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

Vba 从CSV复制数据并将其输出到另一个CSV,vba,excel,macros,Vba,Excel,Macros,我想做三件事:从一个CSV导入数据(如果第2列和第3列中的值符合条件),基于映射键转换此数据,并将此转换后的数据输出到新的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("

我想做三件事:从一个CSV导入数据(如果第2列和第3列中的值符合条件),基于映射键转换此数据,并将此转换后的数据输出到新的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

<>您可以考虑使用ADOB连接而不是VBA来使用SQL。对于大型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
请注意,您需要一个描述CSV结构的文档。这些都是相当容易和快速的设置

那你也可以

a) 直接从MS Access以MS Access查询的形式运行所述SQL查询

或 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
INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
SELECT *
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2
一般性意见:

  • 确保在开发过程中备份原始CSV

  • 由于您对每一行(单元格B2和C2)使用相同的筛选条件,因此调整SQL非常简单,可以像读取单元格内容一样(在Excel中)或使用用户表单(在Access中)来完成

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

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

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

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
INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
SELECT *
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2

<>您可以考虑使用ADOB连接而不是VBA来使用SQL。对于大型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
请注意,您需要一个描述CSV结构的文档。这些都是相当容易和快速的设置

那你也可以

a) 直接从MS Access以MS Access查询的形式运行所述SQL查询

或 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
INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
SELECT *
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2
一般性意见:

  • 确保在开发过程中备份原始CSV

  • 由于您对每一行(单元格B2和C2)使用相同的筛选条件,因此调整SQL非常简单,可以像读取单元格内容一样(在Excel中)或使用用户表单(在Access中)来完成

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

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

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

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
INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
SELECT *
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2

尝试在模块开头使用
选项Excplicit
。这有助于防止错误,例如使用row_num而不是row_count。。。不要也依赖于
activecell
。请尝试在模块开头使用
选项Excplicit
。这有助于防止错误,例如使用row_num而不是row_count。。。不要太依赖于
activecell
。谢谢您的反馈。我没有考虑过使用SQL/VBA,因为一些可访问性问题使VBA成为首选。感谢您的反馈。我没有考虑使用SQL/VBA,因为一些可访问性问题使VBA成为首选。