2015-06-04 3 views
1

У меня довольно простая проблема, на которую я не могу найти ответ.Excel VBA SQL - несколько источников данных

У меня есть следующий SQL: -

Select a from filea where a in (select b from fileb) 

Я пытающегося запустить это в Excel с помощью VBA.

Проблема заключается в том, что filea - это таблица на AS/400, а fileb - таблица в электронной таблице Excel. То есть два разных источника данных. Я не могу найти способ объединить два источника данных в одном выражении SQL.

У кого-нибудь есть яркие идеи.

+0

Какой провайдер вы используете для подключения к AS/400? – Rory

+0

Я использую поставщика доступа к клиенту. Я должен был сказать, что знаю, что могу сделать это, пройдя записи, но мне не нравится это решение. –

ответ

2

В приведенном ниже примере показано, как получить данные из двух книг 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:

src1

Src2.xlsx:

src2

Полученный лист выглядит следующим образом:

result

Он работает на 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/

Смежные вопросы