Excel ADODB-запрос с IMEX = 0 не возвращает данные из первой строки

Я использую ADODB в Excel VBA для запроса/обновления именованного диапазона в другой (закрытой) таблице Excel. SELECT-запросы с ADODB по электронной таблице просты; однако выяснение запроса UPDATE было медведем. После многих, много... много исследований и настройки, я, наконец, получил ОБНОВЛЕНИЕ для работы.

Однако я обнаружил, что запрос SELECT не включает первую строку данных из именованного диапазона, то есть набор записей содержит 19 строк, а именованный диапазон - 20 строк, а первая строка набора записей содержит данные из второй строки именованный диапазон. Именованный диапазон не имеет строки заголовка... это сплошные данные на всем протяжении.

Я знаю, что вы говорите: "О, вам нужно установить свойство HDR" Нет ". :-) Нет, я попробовал это. См. Ниже.

Единственный дополнительный ключ, который у меня есть, заключается в том, что когда IMEX установлен на 1 или 2, запрос SELECT возвращает все строки. Когда IMEX установлен в 0, то первая строка отсутствует. Однако, когда IMEX установлен в 1 или 2, набор записей доступен только для чтения и, следовательно, не может быть обновлен. Насколько я могу судить, единственный способ сделать обновление - установить IMEX на 0.

Для чистоты приведенный ниже код является выдержкой из большей функции.

strSourcePath - это полный путь к целевой книге strSourceRange - это имя диапазона для обновления avNewValues () - это двухмерный массив новых значений для записи в

Я использую 32-разрядный Office 2016 с 64-разрядной Windows 10.

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strconnect As String
Dim strSQL As String
Dim iRow As Integer, iCol As Integer

strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & strSourcePath & ";" & _
            "Extended Properties=""Excel 12.0;HDR=No;IMEX=0"";"

strSQL = "SELECT * FROM " & strSourceRange & ";"

Set conn = CreateObject("adodb.connection")
conn.Open strconnect

Set rs = CreateObject("ADODB.Recordset")
rs.Open strSQL, conn, adOpenStatic, adLockOptimistic

'Update the values in the recordset
rs.MoveFirst
For iRow = 1 To UBound(avNewValues, 1)
    For iCol = 1 To UBound(avNewValues, 2)
        rs.Fields(iCol - 1).Value = avNewValues(iRow, iCol)
    Next
    rs.MoveNext
Next
rs.Update
0
источник поделиться
2 ответа

Попробуйте следующую строку подключения для файла XLSX (обратите внимание на ключевое слово Xml в строке ниже):

 strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & strSourcePath & ";" & _
        "Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=0"";"

или этот для файла XLSM (обратите внимание на ключевое слово Macro в строке ниже):

 strconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & strSourcePath & ";" & _
        "Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=0"";"

Также попробуйте установить IMEX = 1. У меня была аналогичная проблема, и эта комбинация параметров разрешила ее.

0
источник

Вот что я обнаружил. Если вы вообще не указываете свойство IMEX, оно работает, т.е. Все строки возвращаются, а набор записей читается/записывается. Это вызывает недоумение, потому что все документы, которые я могу найти, говорят, что объекты соединения принимают значение IMEX по умолчанию, равное нулю. Если это верно, то явное указание значения по умолчанию изменяет поведение объекта подключения.

Прежде чем я обнаружил это, я решил, что я просто приму плохое поведение и добавлю строку заголовка в диапазоны данных. Но теперь я просто пропущу свойство IMEX в целом и за исключением значения по умолчанию. Это, несомненно, представляет некоторый риск с несоответствиями типа данных, но риск для текущего проекта низкий.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос