Я использую приведенную ниже функцию для извлечения данных из другой книги. Он работает для столбцов без даты, но не работает для столбца, который содержит даты.
Рабочий лист выглядит как
Работает, если не столбец даты:
Debug.Print GetSheetSQL(workbookPath, "Select columna from [sheet$]")(1)("columna")
-> Возвращает "палим"
Не работает, если это столбец даты
Debug.Print GetSheetSQL(workbookPath, "Select columnb from [sheet$]")(1)("columnb")
-> Ничего не возвращает
Function GetSheetSQL(path As String, sqlStr As String) As Collection
'''''''''''''''''''''''''''''''''''''''
'Open ADOB Connection and query via sql
' Connection string is standard and
' taken from:
' https://www.connectionstrings.com/microsoft-jet-ole-db-4-0/standard-excel/
Dim objConnection As Object
Dim objRecordSet As Object
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & path & ";Extended Properties = ""Excel 8.0;HDR=Yes"""
objRecordSet.Open sqlStr, objConnection, adOpenStatic, adLockOptimistic, adCmdText
'''''''''''''''''''''''''''''''''''''''
'Iterate through queried table
' table is a collection with a row per row in the table
' row is a dictionary with table headings as key, returning the corresponding value
Dim table As Collection
Set table = New Collection
Dim row As Object
Dim fld
'iterate through recordset rows
Do Until objRecordSet.EOF
With objRecordSet
Set row = CreateObject("Scripting.Dictionary")
For Each fld In .Fields
row.Add fld.Name, fld.Value
Next fld
table.Add row
.MoveNext
End With
Loop
Set GetSheetSQL = table
'Close Connection; reset Error Handling to default
objConnection.Close
On Error GoTo 0
Exit Function
ErrorCloseConn:
objConnection.Close
On Error GoTo 0
Resume
End Function
В вашем операторе SQL отсутствует несколько кавычек - "Select ... [sheet$]"
Извините, они есть в исходном stmt. Я изменю это
@Storax возвращает строку "NULL", хотя я уверен, что в этой строке есть что-то, а иногда просто ""
Я мог бы воспроизвести вашу проблему. Возможно ли, что одно из ваших полей даты действительно текстовое? По крайней мере, так я смог воспроизвести проблему. В этом случае ADODB просто проигнорирует содержимое ячейки в Excel.
Это обычай в ячейке в немецком формате "benutzerdefiniert".
@Storax Вы имеете в виду одно из значений в поле даты? а другой - это действительно дата, которая смущает Excel? В противном случае, почему ADODB не интерпретирует его как текстовое поле?
Проверьте, является ли первый символ '.
@Zev Spitz: Да, одно из значений в поле даты - это текст, а другое - даты.


Мне удалось воспроизвести проблему, возможно, это поможет
Выглядит нормально, но я изменил первую ячейку с датой на текст. Отладка кода даст вам
Итак, ADODB ожидает дату, Type - adDate и преобразует текст в пустую строку.
The following update solved the problem in the end
ОБНОВИТЬ Может помочь изменить строку подключения на
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & path & ";Extended Properties = ""Excel 8.0;HDR=Yes;IMEX=1"""
Для получения дополнительной информации смотрите здесь
Это влияет на все строки? Или только строка с текстовыми данными в ней?
Для меня это говорит adVarWChar. Я отформатировал все ячейки в текст, но проблема не устранена. У меня есть несколько пустых ячеек в столбце даты. Может быть, в этом проблема? Большое спасибо за помощь !!!
Я также отформатировал все ячейки в текст, затем я также получил тип данных adVarWChar, но я также получил результат
Тогда проблема где-то в моих данных: /
Возможно, но вы также можете попробовать изменить режим импорта
где мне изменить режим импорта? Или вы имеете в виду вообще не использовать SQL?
В строке подключения
@PalimPalim Будет ли форматирование текста изменять тип данных? Разве вам не нужно изменять значение ячейки, начиная с ', чтобы она действительно была текстовой?
Не видел вашего обновления, но в итоге получил то же решение. IMEX = 1 решает все мои проблемы, не нужно форматировать или что-то еще. Ура, чувак!
Я попробовал ваш код, и у меня он отлично сработал. Что ты имеешь в виду под
Returns Nothing?