gpt4 book ai didi

sql - 使用 VBA-Excel 跨多个数据库进行 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 21:35:46 29 4
gpt4 key购买 nike

使用 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 查询中,每个宏都间接连接到第二个工作簿。您可以在任一工作簿内部或外部运行代码。也都运行 genric INNER JOIN在 FileOne 和 FileTwo 工作表上,但任何兼容的 Jet/ACE SQL 语句都应该工作。并且两个输出查询都会导致一个预先存在的 RESULTS 选项卡。



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

关于sql - 使用 VBA-Excel 跨多个数据库进行 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555156/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com