Как объединить две книги с одним общим столбцом, используя SQL в VBA - PullRequest
0 голосов
/ 24 октября 2018

Я верю, что могу делать это и через макрос, но я бы хотел познакомиться с ADODB и SQL-запросами в VBA.Наборы данных находятся не в Access, а в отдельных рабочих книгах, и SQL-запрос для двух рабочих книг выглядит следующим образом:

SELECT getRollpHierRpt.Field1, ['App].[Master Book Name], ['App].[App Book Name], ['App].[Secondary App Book Name], ['App].[App Code], ['App].[App Book Status], ['App].[Book Transit], ['App].[Transit Desc], ['App].[Legal Entity Id], ['App].[Legal Entity Desc]
FROM ['App] INNER JOIN getRollpHierRpt ON ['App].[Book Transit] = getRollpHierRpt.Field1;

Примеры, которые я видел в Интернете, включают получение подключения к серверу Access / SQL, но если наборы данныхдве книги Excel?

Sub MergeIt()
Dim conn1 As New ADODB.Connection
Dim conn2 As New ADODB.Connection
 With conn1
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data 
Source=C:\Users\amzubaid\Desktop\Practice Merging\13-10-2017.xlsm;" & 
"Extended Properties=""Excel 12.0 Macro;HDR=YES';IMEX=1"""
.Open
  End With
With conn2
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data 
Source=C:\Users\amzubaid\Desktop\Practice Merging\20181015-Practice.xlsm;" & "Extended Properties=""Excel 12.0 Macro;HDR=YES';IMEX=1"""
  .Open
 End With
Dim rsSmall As New Recordset
rsSmall.Open "select [Field1] from [getRollpHierRpt$]", conn1
 Dim r As Range
Dim rsBig As New Recordset
Do
Set r = Range("a" & Rows.Count).End(xlUp).Offset(1, 0) 'first unoccupied cell

rsBig.Open "select [App Code],[Legal Entity Desc]," & rsSmall("Field1") & " 
 As GetRollPH from [getRollpHierRpt$] where [BookTransit] = " & 
 rsSmall("Field1"), conn2
 r.CopyFromRecordset rsBig
rsBig.Close
rsSmall.MoveNext
Loop Until rsSmall.EOF  'end if file
rsSmall.Close
conn1.Close
conn2.Close

End Sub

1 Ответ

0 голосов
/ 25 октября 2018

Вам нужно будет установить соединение с каждой книгой.По сути это зависит от обработки каждой книги как таблицы в базе данных.В каждой книге должны быть заголовки столбцов, которые рассматриваются как имена полей.Попробуйте this для получения подробной информации

OK. Таким образом, это не представляется возможным - поэтому один из возможных обходных путей - открыть меньшую таблицу, а затем пошагово пройти по ней и использовать отдельные значения для извлечения нужных записей.из таблицы большего размера: Вот пример использования двух рабочих книг с именами Testfile1 и testfile2.Каждый из них содержит лист с именем «test» и некоторые данные с заголовками столбцов в testfile2, называемые «TestC» и «TestD», а первый (связывание), хранящийся в testfile1, называется «TestA».(Для этого требуется ссылка на библиотеку «Объекты данных Microsoft Active X» в VBE, Инструменты, Ссылки)

Sub TwoFiles()
Dim conn1 As New ADODB.Connection
Dim conn2 As New ADODB.Connection
With conn1
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=P:\testfile1.xlsm;" & "Extended Properties='Excel 12.0 Macro;HDR=YES';"
    .Open
End With
With conn2
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=P:\testfile2.xlsm;" & "Extended Properties='Excel 12.0 Macro;HDR=YES';"
.Open
End With
Dim rsSmall As New Recordset
rsSmall.Open "select [testA] from [test$]", conn1
Dim r As Range
Dim rsBig As New Recordset
Do
Set r = Range("a" & Rows.Count).End(xlUp).Offset(1, 0) 'first unoccupied cell

rsBig.Open "select [TestC],[TestD]," & rsSmall("testA") & " As GetRollPH from [test$] where [testC] = " & rsSmall("testA"), conn2
r.CopyFromRecordset rsBig
rsBig.Close
rsSmall.MoveNext
Loop Until rsSmall.EOF  'end if file
rsSmall.Close
conn1.Close
conn2.Close


End Sub
...