Запрос Excel ADODB с IMEX = 0 не возвращает данные из первой строки - PullRequest
0 голосов
/ 01 мая 2018

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

Однако я обнаружил, что запрос 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

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

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

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

0 голосов
/ 01 мая 2018

Попробуйте следующую строку подключения для файла 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 . У меня была похожая проблема, и эта комбинация параметров разрешила ее.

...