excel - Excel VBA 中使用 ADODB 连接的 csv 文件的不同 SQL 查询
问题描述
我正在尝试使用 Excel VBA 中的 SQL 选择从 CSV 文件中检索数据。这是我尝试过的。
Sub GetMyCSVData()
Dim xlcon As ADODB.Connection
Dim xlrs As ADODB.Recordset
Set xlcon = New ADODB.Connection
Set xlrs = New ADODB.Recordset
Dim currentDataFilePath As String
Dim currentDataFileName As String
Dim nextRow As Integer
currentDataFilePath = "C:\MyFolder"
currentDataFileName = "MyFile"
xlcon.Provider = "Microsoft.Jet.OLEDB.4.0"
xlcon.ConnectionString = "Data Source=" & currentDataFilePath & ";" &
"Extended Properties=""text;HDR=Yes;FMT=Delimited;"""
xlcon.Open
MyQuery = "SELECT * FROM [" & currentDataFileName & ".csv]"
xlrs.Open MyQuery, xlcon
xlrs.MoveFirst
nextRow = Worksheets("Sheet1").UsedRange.Rows.Count + 1
Worksheets("Sheet1").Cells(nextRow, 1).CopyFromRecordset xlrs
xlrs.Close
xlcon.Close
Set xlrs = Nothing
Set xlcon = Nothing
End Sub
这工作正常,但后来,我试图让我的查询更精确:
MyQuery = "SELECT MyField FROM [" & currentDataFileName & ".csv]"
xlrs.Open MyQuery, xlcon
这不起作用(错误 -2147217904 (80040e10))。接着:
MyQuery = "SELECT * FROM [" & currentDataFileName & ".csv] WHERE MyField=10"
xlrs.Open MyQuery, xlcon
这也不起作用(同样的错误)。
当然,我想结合使用这两种方法(从文件中只选择一些字段,并为不同的字段使用一些“where 子句”。
任何帮助将不胜感激。
解决方案
我强烈假设您的数据中没有字段MyField
- 也许这只是拼写错误。
将查询改回select *
以接收所有数据并放置一些行来转储字段名。请注意,Recordset 的字段集合是从 0 开始的。顺便说一句:使用ADO
,您不需要发出MoveFirst
:
xlrs.Open MyQuery, xlcon
Dim i As Integer
nextRow = Worksheets("Sheet1").UsedRange.Rows.Count + 1
' Dump fieldnames
For i = 1 To xlrs.Fields.Count
Worksheets("Sheet1").Cells(nextRow, i) = xlrs.Fields(i - 1).Name
Next i
nextRow = nextRow + 1
Worksheets("Sheet1").Cells(nextRow, 1).CopyFromRecordset xlrs
推荐阅读
- ios - 当我们在 DidSelect 上附加数组时,我们必须这样做以删除 DidDeselect 中的确切对象
- python - 使用条件逻辑创建新列并取决于列是否存在
- php - 如何从 laravel 控制器的表中获取 n 个数据?
- android - Android推送令牌被重置
- git - Git比较两个文件
- javascript - 如何保持字符串在视图中?外部窄 div 中的内部宽 div。内部宽 div 中的字符串
- spss - 如果变量中有文本,则 SPSS 标志
- javascript - 单击删除时不要重新加载页面
- multithreading - 用一个线程读取,将数据发送到另一个线程
- azure-sql-database - ntext、text 和 image 什么时候会被弃用?