【问题标题】:Dynamic WHERE condition when calling SQL from VBA从 VBA 调用 SQL 时的动态 WHERE 条件
【发布时间】:2011-12-14 05:59:16
【问题描述】:

在 Excel 中,我有一列 ID。我想根据 ID 列中的值从表中选择值。到目前为止,我已经知道了,其中 ws.Cells(i,10) 指的是 K 列中每一行的值。

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
    "ODBC;DSN=xxxx;Description=xxxxx;UID=xxx;APP=2007 Microsoft Office system;WSID=xxx" _
    ), Array("56;DATABASE=xxx;Trusted_Connection=Yes")), Destination:=Range( _
    "$M$3")).QueryTable        

    For i = 1 To 691
    sText = "SELECT Instrument.ID, Instrument.MATURITY FROM xxxx.dbo.Instrument Instrument WHERE Instrument.ID=" & ws.Cells(i, 10).Value & ""
    .CommandText = Array(sText)
    Next

End With

我在 sText 行上收到错误“424”,错误消息“需要对象”。

我也有预感,这不是最好的方法。必须有一个更简单的设置才能从列中运行带有 WHERE 条件的 SQL。

感谢您的帮助!

【问题讨论】:

  • 我相信 Excel 可能有一个内置连接,或者至少是一个插件,可以让 Excel 直接与数据库对话。我还要小心连接字符串 - SQL 注入很讨厌。
  • 您的数据库是 SQL Server 吗?如果是这样,OpenRowset 可能适合。它将允许您同时从 SQL 数据库和 Excel 中提取数据。

标签: sql excel vba select


【解决方案1】:

我几乎可以肯定 iDevlop 是正确的 - 您尚未定义变量 ws,这会导致“需要对象”错误消息。

无论如何,您可能更喜欢这个解决方案:

Dim IDs as String
Dim ws As Worksheet
Set ws = ActiveSheet
IDs = Join(WorksheetFunction.Transpose( _
           ws.Range(ws.Cells(1, 10), ws.Cells(691, 10))), ",")
.CommandText = "SELECT ... FROM ... WHERE Instrument.ID in (" + IDs + ")"

不需要循环。

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多