Excel VBA 针对 SQL 表交叉引用 Excel 表
Posted
技术标签:
【中文标题】Excel VBA 针对 SQL 表交叉引用 Excel 表【英文标题】:Excel VBA to cross reference a Excel Table against a SQL Table 【发布时间】:2017-10-12 16:08:18 【问题描述】:我一直在使用以下 vba 代码Using Excel VBA to run SQL query(注意此链接中的赞成答案是我使用的方法)这允许我在 excel 单元格中输入一个值,并将来自 sql 的结果转储到另一列中。
但是我现在遇到的问题是我想对一个 excel 列中的多个单元格(不仅仅是一个单元格)运行它,并希望为我提供来自 sql 的另一列(如 vlookup)的状态。
我的数据包含大约 20000 行,我需要从 sql 中超过 100 万条记录的状态列中检查状态。
无法使用链接的方法一一做,不知道是否可以在我的StrQuery中使用'" & Range("A3") & "'"
而不是使用表?
澄清这是我正在使用的:
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
ConnectionString = "Provider=SQLOLEDB.1;Password=PASSWORD;Persist Security Info=True;User ID=USERNAME;Data Source=REMOTE_IP_ADDRESS;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=DATABASE"
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT StatusColumn FROM Status WHERE Contact = " & Range("A2") & "'"
'Performs the actual query
rst.Open StrQuery, cnn
Sheets(1).Range("B2").CopyFromRecordset rst
End Sub
我想知道是否可以将我的 sql 查询中的范围从 A2 更改为 A:A 或 A2:A20000 并转储到 B:B 或 B2:B20000 中,但这不起作用。
编辑:我再次运行此程序取得了半成功,但范围增加了 1,但空间不足,循环可以帮助吗?
【问题讨论】:
【参考方案1】:考虑一个distributed query,您在其中使用 Excel 工作簿作为自己的表,并将其与本地 SQL Server 表进行内部连接。这假设 ad-hoc distributed query privileges 已启用。
以下假设 Excel 数据维护标题列(其中一个名为 status_column)并从 SheetName 的第一个单元格 A1 开始:
SELECT *
FROM mysqlServerTable s
INNER JOIN
(OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\Path\To\File.xlsx;Extended Properties=Excel 12.0', SheetName$)) e
ON s.status_column = e.status_column
【讨论】:
感谢您的回答,我目前没有启用ad-hoc分布式查询权限,没有这个还有其他路由吗? 由于您有超过 100 万条记录,请将 SQL Server 表导入 MS Access 数据库,然后在 Access 和 Excel 之间运行查询,甚至导入 Excel 工作表并在 Access 中运行查询。或者在 SQL Server 中导入 Excel 工作表并从那里运行查询。 另外,您不需要 MSAccess.exe(GUI Office 软件)来使用 Access 数据库。任何 Windows PC 都安装了 JET/ACE 引擎(.dll 文件)。您可以从 Excel VBA 创建数据库。见here。 Access 不喜欢 SQL 表中的大量数据。 但在 Excel 中更是如此! Access 有 2GB 的文件限制(255 列限制,但对任何表都没有行限制)。尝试限制SELECT
中的列。对于小字符大小和整数类型,即使有 1 多行,数据也应该适合 Access 数据库。特别是如果在不同的 Excel 列表中加入(即过滤)较少行。以上是关于Excel VBA 针对 SQL 表交叉引用 Excel 表的主要内容,如果未能解决你的问题,请参考以下文章
如何用VBA将EXCEL中的若干的数据导入不同的word文档