Я использую 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