2016-07-24 9 views
0

Использование Excel 2010, SQL и DAOИспользование VBA-Excel для SQL запроса по нескольким базам данных

Я пытаюсь выполнить запрос к таблицам, которые проживают за пределами текущей таблицы. Это было бы тривиально, внутри Access, со связанными таблицами/базами данных, но, используя VBA в excel, меня заглушат.

Предположив это:

ExcelFileOne; Tab; various headed field/columns 
ExcelFileTwo; Tab; various headed field/columns 

Я хочу, чтобы выполнить запрос внутри третьего файла Excel, который выходит что-то вроде этого [используя точечную нотацию для объяснения, а не кодирования ....] - простой пример :

SELECT FileOne.[Tab$].Fields, FileTwo.[Tab$].Fields, etc. 
    FROM FileOne, FileTwo, Thisworkbook 
    WHERE (FileOne.[Tab$].field2 <> FileTwo.[Tab$].Field2) 
     AND (ThisWorkbook.[Tab$].Field1 ....) 

В принципе, я хочу дублировать то, что Access будет делать изначально, для этого связанного файла.

Указатели в правильном направлении?

[[Я мог бы использовать указатель на то, почему использование «Excel 8.0 ...» в соединении работает или выходит из строя на Excel2010, с файлами макросов и как загрузить вариант 12 или 14 в сети/системе, закрытой для пользователи ....]]

+0

драйвер ODBC для исследований EXCEL; возможно, начиная с этого момента: https://www.connectionstrings.com/microsoft-excel-odbc-driver/ –

+0

Excel не является сервером БД и не имеет встроенного механизма БД. Он просто способен понимать SQL с помощью внешних библиотек, таких как «ADO» или «DAO». Если у вас есть Office 2016 или 2013 и установлен [PowerQuery] (https://support.office.com/en-us/article/Introduction-to-Microsoft-Power-Query-for-Excel-6e92e2f4-2079-4e1f-bad5 -89f6269cd605), то это ** теперь возможно с помощью этой новой надстройки. В противном случае вам придется полагаться на Access или SQL-Server для выполнения этой задачи (или переносить оба листа в один файл, а затем преобразовывать/размножать их с помощью VBA в соответствии с вашими потребностями). – Ralph

ответ

3

Вы действительно можете запросить другие книги, используя DAO и ADO, непосредственно в SQL-запросе, а также запросить таблицы баз данных Access, просто ссылаясь на их пути. И наоборот, в запросе Access вы можете запросить книги Excel! Это свидетельствует о том, что Jet/ACE SQL engine (файлы Windows .dll) не ограничивается каким-либо одним продуктом MS Office или программой Windows, а инструментом для всех.

В обоих примерах макросы делают прямое подключение к первой книге, а в SQL-запросе каждый косвенно подключается ко второй книге. Вы можете запускать код внутри или снаружи книг. Также оба запускают genric INNER JOIN на FileOne и Рабочие листы FileTwo, но любой совместимый оператор Jet/ACE SQL должен работать. И оба выходных запроса возвращаются в ранее существовавшие РЕЗУЛЬТАТЫ.

DAO

Dim dbE As Object, db As Object, rst As Object 
Dim sqlString As String 
Dim i As Integer 
Const dbOpenDynaset = 2, dbReadOnly = 4 

' OPEN DB CONNECTION 
Set dbE = CreateObject("DAO.DBEngine.120") 'ALSO TRY: DAO.DBEngine.35 OR .36 
Set db = dbE.OpenDatabase("C:\Path\To\FileOne.xlsm", False, True, "Excel 12.0 Xml;HDR=Yes") 

' OPEN QUERY RECORDSET 
sqlString = " SELECT * FROM [TAB$] t1" _ 
       & " INNER JOIN (SELECT * FROM" _ 
       & " [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\FileTwo.xlsm].[TAB$]) t2" _ 
       & " ON t1.ID = t2.ID" 

Set rst = db.OpenRecordset(sqlString, dbOpenDynaset, dbReadOnly) 

' COLUMNS 
For i = 1 To rst.Fields.Count 
    Worksheets("RESULTS").Cells(1, i) = rst.Fields(i - 1).Name 
Next i 

' DATA ROWS 
Worksheets("RESULTS").Range("A2").CopyFromRecordset rst 

rst.Close 
db.Close 

Set rst = Nothing 
Set db = Nothing 
Set dbE = Nothing 

АДО

Dim conn As Object, rst As Object, fld As Object 
Dim strConnection As String, strSQL As String 
Dim i As Integer 

Set conn = CreateObject("ADODB.Connection") 
Set rst = CreateObject("ADODB.Recordset") 

' OPEN DB CONNECTION 
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
        & "Data Source='C:\Path\To\FileOne.xlsm';" _ 
        & "Extended Properties=""Excel 12.0 Xml;HDR=YES;"";"   

conn.Open strConnection 

' OPEN QUERY RECORDSET 
strSQL = " SELECT * FROM [TAB$] t1" _ 
      & " INNER JOIN (SELECT * FROM" _ 
      & " [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\FileTwo.xlsm].[TAB$]) t2" _ 
      & " ON t1.ID = t2.ID" 

rst.Open strSQL, conn 

' COLUMNS 
For i = 1 To rst.Fields.Count 
    Worksheets("RESULTS").Cells(1, i) = rst.Fields(i - 1).Name 
Next i 

' DATA ROWS 
Worksheets("RESULTS").Range("A2").CopyFromRecordset rst 

rst.Close 
conn.Close 

Set rst = Nothing 
Set conn = Nothing 
+0

Спасибо ...! Другие извилистые мысли: 1) Я вижу объект dbe, является ли создание уникального мира, в который может жить запрос на все три файла [локальный и внешний]? 2) Почему 12, и если 8 работ к 12 не [из-за отсутствия 12 на моей закрытой офисной машине, что делать, когда я не могу загрузить программное обеспечение и т. Д.) 3) Я полагаю, что 36 - это ссылку на DAO 3.6 на мою установку MS, правильно? 4) Почему не соединение DAO, как и в оснащении объектной модели, я вижу, что там тоже. – John

+0

Используйте любую версию DAO, которую вы установили.Или используйте ADO, который не требует версий и переводится в другие базы данных (MySQL, SQL Server и т. Д.) - просто подключайте строковые соединения и инструкции SQL. И, как уже упоминалось, примеры здесь сначала подключаются к первому файлу Excel и внутри SQL-запроса соединяются со вторым. – Parfait

+0

Это сработало, @Parfait, но когда я потянулся к файлу CSV, я столкнулся с ошибками, поместив внешнюю ссылку в предложение FROM. Вы можете пик? John