查询每个单元格值返回不同结果的单元格区域 – Excel VBA ADODB

我已经在这一段时间了,我一直没能弄清楚这一点…

我正在尝试编写一个macros来查询Teradata数据库中一个可变范围的ID。 如果仅将一个ID作为parameter passing给命令,我可以使其工作,但是我一直无法find查询全部范围的方法。 目前在该范围内有2456个不同的ID(单元格B2:B2456)。 预期的最终结果是:ID /。

从networking拖网,它会出现一个循环将需要查询所有个人ID。 这使我感到惊讶,因为我原以为有一种方法可以一次通过全部范围。 我试图将所有值连接到一个单元格,但是这不会返回任何结果。

如果可能的话,我想find一种方法来查询完整的范围,而不需要将每个ID传递给一个单独的查询。 我可以开始的任何提示?

编辑:我从那以后发现可以在SQL查询中引用可变数量的ID – 即从表中selectID IN(?,?,?,?,?…),数量为? 指定它将接受的参数数量。 基于这一点,我想循环可以添加参数的完整列表,但是我难以想象我可以如何将这与数量? 在SQL查询中…

Set Command1 = New ADODB.Command Set Param1 = Command1.CreateParameter("ID", adLongVarWChar, adParamInput, 203, Wb2.Range("C1").Text) Command1.Parameters.Append Param1 Command1.CommandText = " select distinct ID, Price from TABLE where ID IN ? " Command1.CommandType = adCmdText Command1.CommandTimeOut = 240 Set connect = GetNewConnection Command1.ActiveConnection = connect Set rec1 = New ADODB.Recordset Set rec1 = Command1.Execute() Wb.Activate With Wb.QueryTables.Add(Connection:=rec1, Destination:=Wb.Range("A1")) .Name = "data" .FieldNames = True .Refresh BackgroundQuery:=False End With rec1.Close connect.Close Set rec1 = Nothing Set connect = Nothing End Sub 

我能通过连接所有的值来解决这个问题(“ID1”,“ID2”,“ID3”…“ID2045”),并赋予它一个variables。有趣的是,因为这基本上是我最初尝试的,不同之处在于我手动连接了Excel中的值,然后指向VBA中的单元格(即Range(“C1”).Text),其结果是不返回任何结果。

我非常渴望了解更好的编写方式,因为我相信使用stringvariables会让您打开SQL注入(?)。 在任何情况下,这给了我想要的结果,它总是查询variables范围的ID,并返回ID +其相关的价格。

 Sub SQLQueryContinued2() Dim connect As ADODB.Connection Dim rec1 As ADODB.Recordset Dim wb As Worksheet Dim Wb2 As Worksheet Dim Param() As ADODB.Parameter Dim Command1 As ADODB.Command Dim lrow As Integer Dim i As Integer Dim ConcatSQL As String Set wb = ActiveWorkbook.Sheets("Sheet3") Set Wb2 = ActiveWorkbook.Sheets("Sheet2") lrow = Wb2.Range("B" & Wb2.Rows.Count).End(xlUp).Row 'Concatenate desired range into one cell For i = 0 To lrow - 4 ConcatSQL = ConcatSQL & "'" & Wb2.Cells(i + 2, 3) & "'" & "," Next i ConcatSQL = "(" & Left(ConcatSQL, Len(ConcatSQL) - 1) & ")" 'Open Command Object with One Paramter Set Command1 = New ADODB.Command With Command1 .CommandText = " sel distinct ID, Price from TABLE where ID IN " & ConcatSQL .CommandType = adCmdText .CommandTimeout = 600 End With 'Connect to Data Source Set connect = GetNewConnection 'Represents Private Function with Connection String Command1.ActiveConnection = connect Set rec1 = New ADODB.Recordset Set rec1 = Command1.Execute() 'Paste Results wb.Activate With wb.QueryTables.Add(Connection:=rec1, Destination:=wb.Range("A1")) .Name = "data" .FieldNames = True .Refresh BackgroundQuery:=False End With 'Close Connections rec1.Close connect.Close Set rec1 = Nothing Set connect = Nothing End Sub