Различные запросы SQL в Excel VBA для CSV-файлов с использованием подключения ADODB - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь получить данные из файла CSV с помощью SQL Select в Excel VBA. Это то, что я пробовал.

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» для разных полей.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 января 2019

Я настоятельно полагаю, что у вас нет поля MyField в ваших данных - возможно, это просто ошибка.

Измените запрос обратно на select *, чтобы получить все данные и добавить несколько строк для вывода имен полей. Обратите внимание, что коллекция полей набора записей основана на 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
...