从另一个 Excel 或 Access 数据库查询

问题描述 投票:0回答:1

我的 Excel 文件中有两个工作表。

一个工作表充当我们销售的产品的数据库,其中包含“产品 ID”、“产品代码”和“描述”列。

另一个工作表充当产品查找工具,您可以在第一列中粘贴多个产品 ID,它将在相邻列中返回产品代码和说明。

我使用 INDEX 搜索,但数据库表太大而无法在同一文件中管理,导致速度严重减慢。

我正在考虑将数据库表分离为 Excel 或 AccessDB 文件,但我认为它需要大量的 VBA 操作。

excel vba ms-access excel-formula export-to-excel
1个回答
1
投票

您可以使用 ADO 访问 Microsoft Access 中的数据并执行 SQL 查询来收集数据。

您能告诉我是否可以为 WHERE 子句指定单元格范围吗?

是的,有一个技巧。 SQL命令是纯文本的,你只需要使用你的参数来构建它。在 WHERE 子句中使用运算符 IN

我制作了一个假数据集作为示例。这是我的 Excel 产品查找器(名为

Table1
的表格):

注意,我只想要产品 6,3 和 2 的信息。现在我的假数据库:

具体产品查询代码:

Sub TEST()
Dim cnn As Object
Dim RST As Object
Dim DatabasePath As String
Dim i As Long
Dim Allid As String
Dim Arrayid As Variant
Dim SQLQuery As String



DatabasePath = "C:\Temp\temp.accdb" 'path to database

'Create a connection object.
Set cnn = CreateObject("ADODB.Connection")

'Create recordset object
Set RST = CreateObject("ADODB.Recordset")

'Open a connection using the OLE DB connection string.
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DatabasePath & ";Persist Security Info=False;"

'merge all ID into one single string
Arrayid = Range("Table1[PRODUCT ID]").Value
For i = LBound(Arrayid) To UBound(Arrayid) Step 1
    Allid = Allid & Arrayid(i, 1) & ","
Next i

Allid = Left(Allid, Len(Allid) - 1) 'get rid of last comma
Erase Arrayid 'clean array variable

'specify query
SQLQuery = "SELECT PRODUCT_TABLE.[Product Id], PRODUCT_TABLE.[Product Code], PRODUCT_TABLE.Description FROM PRODUCT_TABLE " & _
    "WHERE PRODUCT_TABLE.[Product Id] In (" & Allid & ") ORDER BY PRODUCT_TABLE.[Product Id]"


'Open a recordset using the Open method
'and use the connection established by the Connection object.
RST.Open SQLQuery, cnn

'copy all data into cells. This will bring full query without headers
Range("A6").CopyFromRecordset RST

'close and clean variables
RST.Close
cnn.Close
Set RST = Nothing
Set cnn = Nothing

End Sub

执行代码后我得到这个:

注意输出没有像我们之前那样排序。我们按照 6,3,2 的顺序询问产品,但输出是 2,3,6!

这是因为我的 SQL 查询得到了按 ID 字段排序的运算符 ORDER BY。如果没有 ORDER BY 子句,输出将按照存储在数据库中的方式进行排序,而不是按照 Excel 进行排序。

如果您确实需要输出与您的产品查找器的顺序完全一致,您可以创建一个 UDF 函数来查询每个单个 id 一次,并为每个产品返回一行,但如果您使用很多产品的数据,这可能会消耗大量时间。所以请仔细考虑如何处理这部分。 顺便说一句,请确保使用正确的连接字符串。您可以在

访问连接字符串

上找到许多内容

© www.soinside.com 2019 - 2024. All rights reserved.