簡體   English   中英

使用VBA-Excel進行跨多個數據庫的SQL查詢

[英]Using VBA-Excel for an SQL query across multiple databases

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

基本上,我想復制該鏈接文件的Access本地操作。

指向正確方向的指針?

[[我可以使用一個指針,為什么在帶有宏文件的Excel2010上連接中使用“ Excel 8.0 ...”可以正常工作或失敗,以及如何在對用戶關閉的網絡/系統中加載12或14變體... ]]。

您確實可以直接在SQL語句中使用DAO和ADO查詢其他工作簿,並且同樣可以通過簡單地引用它們的路徑來查詢Access數據庫表。 相反,在Access查詢中,您可以查詢Excel工作簿! 這證明了Jet / ACE SQL引擎(Windows .dll文件)不限於任何一種MS Office產品或Windows程序,而是針對所有工具的事實。

在下面的兩個示例中,宏都直接連接到第一個工作簿,而在SQL查詢中,每個宏都間接連接到第二個工作簿。 您可以在兩個工作簿內部或外部運行代碼。 兩者都在FileOneFileTwo工作表上運行通用的INNER JOIN ,但是任何兼容的Jet / ACE SQL語句都應該起作用。 並且兩個輸出查詢的結果都在一個預先存在的“ 結果”選項卡中。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM