Очень простая функция запроса, который принимает путь для исходного файла CSV и SQL заявления в виде строки (я также перенося данные из функции VBA),Почему этот код VBA для SQL-запросов в файлах CSV работает с перерывами?
Public Function RunQuery(FilePath As String, SQLStatement As String)
Dim Conn As New ADODB.Connection
Dim RecSet As New ADODB.Recordset
With Conn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & FilePath & ";" & _
"Extended Properties=""text;HDR=Yes;FMT=Delimited;IMEX=1"""
End With
Conn.Open
RecSet.Open SQLStatement, Conn
RecSet.MoveFirst
RunQuery = RecSet.GetRows()
Conn.Close
Set RecSet = Nothing
Set Conn = Nothing
End Function
Этот код работает с перерывами против CSV-файлы, некоторые данные извлекаются правильно, а некоторые нет.
Примером являются эти два файла CSV - Abbreviated и Full. Следующий SQL-запрос отлично работает в сокращенном файле, но возвращает #VALUE в полном файле.
SELECT birthYear FROM [File]
Это определенно не проблема ограничения объема данных, так как полный файл содержит только 1800 строк. Я полностью одурачен и буду признателен за любые мысли/указатели.
Кстати, если я завернуть логику в Суб, а не ОДС, то он отлично работает без каких-либо ошибок,
Public Sub RunQuerySub()
Dim Conn As New ADODB.Connection
Dim RecSet As New ADODB.Recordset
Dim FilePath As String
FilePath = ActiveSheet.Range("Path")
With Conn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & FilePath & ";" & _
"Extended Properties=""text;HDR=Yes;FMT=Delimited;IMEX=1"""
End With
Dim SQLStatement As String
SQLStatement = ActiveSheet.Range("SQL")
Conn.Open
RecSet.Open SQLStatement, Conn
ActiveSheet.Cells(1, 8).CopyFromRecordset RecSet
Conn.Close
Set RecSet = Nothing
Set Conn = Nothing
End Sub
Я очень смущен, и будет признателен за любые указатели.
Куда он возвращает '# VALUE'? Ваш код присваивает массив, * RunQuery *, для записей наборов строк. – Parfait
Если я установил точку останова на последней строке 'Set Conn = Nothing', тогда' RunQuery' отобразит массив Variant в окне Watch, который содержит полный список результатов. Но по какой-то причине он возвращает #VALUE самому листу. Как уже упоминалось, эта проблема возникает только с большим файлом, а не с меньшим. – insomniac
Используете ли вы это как UDF на листе? Если вы попытаетесь позвонить ему из Sub, вы получите более полезные сообщения об ошибках. –