В приведенном ниже примере показано, как получить данные из двух книг excel в одном SQL-запросе (так как у меня нет источника данных AS/400) и поместить набор записей результатов на рабочий лист. Код помещается в Query.xlsm
:
Option Explicit
Sub SqlWhereInTest()
Dim strConnection As String
Dim strQuery As String
Dim objConnection As Object
Dim objRecordSet As Object
strConnection = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"User ID=Admin;" & _
"Data Source='" & ThisWorkbook.FullName & "';" & _
"Mode=Read;" & _
"Extended Properties=""Excel 12.0 Macro;"";"
strQuery = _
"SELECT * FROM [Sheet1$] " & _
"IN '" & ThisWorkbook.Path & "\Src1.xlsx' " & _
"[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
"WHERE Country IN " & _
"(SELECT CountryFilter FROM [Sheet1$] " & _
"IN '" & ThisWorkbook.Path & "\Src2.xlsx' " & _
"[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'])"
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open strConnection
Set objRecordSet = objConnection.Execute(strQuery)
RecordSetToWorksheet Sheets(1), objRecordSet
objConnection.Close
End Sub
Sub RecordSetToWorksheet(objSheet As Worksheet, objRecordSet As Object)
Dim i As Long
With objSheet
.Cells.Delete
For i = 1 To objRecordSet.Fields.Count
.Cells(1, i).Value = objRecordSet.Fields(i - 1).Name
Next
.Cells(2, 1).CopyFromRecordset objRecordSet
.Cells.Columns.AutoFit
End With
End Sub
Также есть два рабочих книг в качестве источников данных в той же папке, Query.xlsm
.
Src1.xlsx
содержащий Customers:
Src2.xlsx
:
Полученный лист выглядит следующим образом:
Он работает на 64-разрядной версии Excel 2013 для меня. Чтобы сделать его совместимым с .xls
и Excel 2003 (где поставщик ACE.OLEDB.12.0
не установлен), вы должны заменить Provider=Microsoft.ACE.OLEDB.12.0;
на Provider=Microsoft.Jet.OLEDB.4.0;
, а также в расширенных свойствах Excel 12.0 Macro;
/Excel 12.0;
с Excel 8.0;
. Фактически источник данных для объекта соединения не ограничивается единственным файлом Query.xlsm
(см. Раздел ThisWorkbook.FullName
в пределах strConnection
), в который помещен код. Это может быть другой источник данных, совместимый с одним из доступных поставщиков, будь то на основе файлов или на сервере, исходя из. Найдите дополнительные строки подключения для источника данных на http://www.connectionstrings.com/
Какой провайдер вы используете для подключения к AS/400? – Rory
Я использую поставщика доступа к клиенту. Я должен был сказать, что знаю, что могу сделать это, пройдя записи, но мне не нравится это решение. –