Извлекать данные Excel через sql; столбец даты не работает

Я использую приведенную ниже функцию для извлечения данных из другой книги. Он работает для столбцов без даты, но не работает для столбца, который содержит даты.

Рабочий лист выглядит как

Извлекать данные Excel через sql; столбец даты не работает

Работает, если не столбец даты:

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

Я попробовал ваш код, и у меня он отлично сработал. Что ты имеешь в виду под Returns Nothing?

Storax 01.08.2018 19:08

В вашем операторе SQL отсутствует несколько кавычек - "Select ... [sheet$]"

Zev Spitz 01.08.2018 19:11

Извините, они есть в исходном stmt. Я изменю это

PalimPalim 01.08.2018 19:14

@Storax возвращает строку "NULL", хотя я уверен, что в этой строке есть что-то, а иногда просто ""

PalimPalim 01.08.2018 19:15

Я мог бы воспроизвести вашу проблему. Возможно ли, что одно из ваших полей даты действительно текстовое? По крайней мере, так я смог воспроизвести проблему. В этом случае ADODB просто проигнорирует содержимое ячейки в Excel.

Storax 01.08.2018 19:16

Это обычай в ячейке в немецком формате "benutzerdefiniert".

PalimPalim 01.08.2018 19:18

@Storax Вы имеете в виду одно из значений в поле даты? а другой - это действительно дата, которая смущает Excel? В противном случае, почему ADODB не интерпретирует его как текстовое поле?

Zev Spitz 01.08.2018 19:19

Проверьте, является ли первый символ '.

Zev Spitz 01.08.2018 19:20

@Zev Spitz: Да, одно из значений в поле даты - это текст, а другое - даты.

Storax 01.08.2018 19:27
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
9
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось воспроизвести проблему, возможно, это поможет

Выглядит нормально, но я изменил первую ячейку с датой на текст. Отладка кода даст вам

Итак, 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"""

Для получения дополнительной информации смотрите здесь

Это влияет на все строки? Или только строка с текстовыми данными в ней?

Zev Spitz 01.08.2018 19:26

Для меня это говорит adVarWChar. Я отформатировал все ячейки в текст, но проблема не устранена. У меня есть несколько пустых ячеек в столбце даты. Может быть, в этом проблема? Большое спасибо за помощь !!!

PalimPalim 01.08.2018 19:28

Я также отформатировал все ячейки в текст, затем я также получил тип данных adVarWChar, но я также получил результат

Storax 01.08.2018 19:31

Тогда проблема где-то в моих данных: /

PalimPalim 01.08.2018 19:33

Возможно, но вы также можете попробовать изменить режим импорта

Storax 01.08.2018 19:35

где мне изменить режим импорта? Или вы имеете в виду вообще не использовать SQL?

PalimPalim 01.08.2018 19:36

В строке подключения

Storax 01.08.2018 19:36

@PalimPalim Будет ли форматирование текста изменять тип данных? Разве вам не нужно изменять значение ячейки, начиная с ', чтобы она действительно была текстовой?

Zev Spitz 01.08.2018 19:48

Не видел вашего обновления, но в итоге получил то же решение. IMEX = 1 решает все мои проблемы, не нужно форматировать или что-то еще. Ура, чувак!

PalimPalim 01.08.2018 20:01

Другие вопросы по теме