【问题标题】:Excel VBA to cross reference a Excel Table against a SQL TableExcel VBA 针对 SQL 表交叉引用 Excel 表
【发布时间】: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,但空间不足,循环可以帮助吗?

【问题讨论】:

    标签: sql sql-server excel vba


    【解决方案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 列表中加入(即过滤)较少行。
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多