在多个数据库中使用VBA-Excel进行SQL查询

使用Excel 2010,SQL和DAO

我正在试图执行一个查询当前电子表格以外的表。 这将是微不足道的,内Access,与链接的表/数据库,但在Excel中使用VBA,我受阻。

假定这些:

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 ....) 

基本上,我想重复什么访问将本地执行该链接的文件。

指向正确的方向?

[[我可以使用一个指针,指出为什么在连接中使用“Excel 8.0 …”或在Excel2010中失败,使用macros文件,以及如何在closures用户的networking/系统中加载12或14变体。 。]]

您确实可以直接在SQL语句中使用DAO和ADO来查询其他工作簿,并且通过简单地引用它们的path来查询Access数据库表。 相反,在Access查询中,您可以查询Excel工作簿! 这是Jet / ACE SQL引擎(Windows .dll文件)不限于任何一个MS Office产品或Windows程序,而是所有工具的事实的certificate。

在下面的两个示例中,macros都直接连接到第一个工作簿,而在SQL查询中,每个间接连接到第二个工作簿。 您可以在工作簿内部或外部运行代码。 也都在FileOneFileTwo工作表上运行genric INNER JOIN ,但任何兼容的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 

ADO

 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 
Interesting Posts