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 表的主要内容,如果未能解决你的问题,请参考以下文章

求助,EXCEL通过VBA操作SQL数据库

Excel vba引用工作表的三种写法

如何用VBA将EXCEL中的若干的数据导入不同的word文档

引用另外表格,提示 #REF!路径也设置好了。被引用的表格不打开就错误,打开就正常。不用vba能处理吗?

excel vba链接sql怎样使运行速度变快

Excel VBA 引用文件夹选择器 *VBA 的新功能 * [重复]