Vba 从CSV复制数据并将其输出到另一个CSV
我想做三件事:从一个CSV导入数据(如果第2列和第3列中的值符合条件),基于映射键转换此数据,并将此转换后的数据输出到新的CSVVba 从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("
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)中,我首先连接到一个名为
的ACCDB,这在我的代码中显然毫无意义,因为您可以使用直接连接到文本文件。然而,如果您计划进行一些映射,您可以在所述Access数据库中维护映射表,并在SQL中使用它们(通过联接)yourDB.ACCDB
- 此外,我个人喜欢这样一个事实:在这种情况下,任何路径信息都包含在SQL语句中,即使它的性能稍慢
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)中,我首先连接到一个名为
的ACCDB,这在我的代码中显然毫无意义,因为您可以使用直接连接到文本文件。然而,如果您计划进行一些映射,您可以在所述Access数据库中维护映射表,并在SQL中使用它们(通过联接)yourDB.ACCDB
- 此外,我个人喜欢这样一个事实:在这种情况下,任何路径信息都包含在SQL语句中,即使它的性能稍慢
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成为首选。