如何解决VBA中带有n个WHERE参数的SQL查询
我正在使用ADO在VBA中运行SQL查询。我已经做了很多,一切正常。
但是,我正在进行更复杂的查询,在该查询中,我需要输入未知数量的条件字符串。简而言之:
SELECT * FROM database.dbo.table
WHERE Col1 IN (‘val1’,‘val2’,...,‘valn’)
我的工作表上有一组数据,每次都会更改。数据每次都具有相同的字符串格式,但是带有值的单元格数量有所不同。我想使用n
语句中的WHERE
个变量来执行上述查询。
工作表中有5个变量的查询示例:
SELECT * FROM database.dbo.table
WHERE Col1 IN (‘000165234’,‘000165238’,‘000165231’,‘000165232’,‘000165239’)
任何指向正确方向的指针都将受到赞赏。 我最大的问题是如何处理未知数量的变量。
约束:将始终是至少1个带值的单元格,并且永远不会超过60个。
注释:数据也存储在数组中,不一定需要打印在工作表上。
更新的代码
Sub test()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
Set ws2 = ThisWorkbook.Worksheets("Sheet2")
Dim fRow As Long
Dim sRow As Integer
Dim col As Integer
Dim arr() As Variant
Dim coll As New Collection
col = 3
sRow = 6
With ws1
fRow = .Cells(.Rows.Count,col).End(xlUp).Row
End With
With ws2
fRow2 = .Cells(.Rows.Count,12).End(xlUp).Row
End With
For i = sRow To fRow
With ws1
ele1= .Cells(i,2).Value
ele2= "000" & .Cells(i,4).Value
If ele1<> "" Then
coll.Add Array(ele2)
End If
End With
Next
On Error GoTo gotcha
ReDim arr(1 To coll.Count,1 To 2)
For i = 1 To coll.Count
arr(i,1) = coll(i)(0)
Next
gotcha:
Debug.Print Err.number
If Err.number = 9 Then
MsgBox "Error"
Exit Sub
End If
ws2.Range("L29:M" & fRow2).ClearContents
ws2.Range("L29").Resize(UBound(arr,1),UBound(arr,2)).Value = arr
Set conn = CreateObject("ADODB.Connection")
Dim fRow3 As Long
With ws2
fRow3 = .Cells(.Rows.Count,13).End(xlUp).Row
End With
Dim CONNECTION As String
Dim QUERY As String
Dim WHERE As String
'Set connection and SELECT query
CONNECTION = "Provider=*.1;Persist Security Info=True;User ID=*; Password=*; Data Source=*;Initial Catalog=*"
selectpart = "SELECT *FROM database.dbo.table "
'### The error occurs here ###
conditionpart = "WHERE [COL1] IN ('" & Join(arr,"','") & "')"
GetBreakerQuantitiesQuery = selectpart & vbNewLine & conditionpart
QUERY = GetBreakerQuantitiesQuery
conn.Open CONNECTION
Set rs = CreateObject("ADODB.Recordset")
rs.ActiveConnection = conn
rs.Open QUERY
ws.Range("T6").copyFromrecordset rs
ws.Range("T6:AL6").copy
ws.Range("N7").PasteSpecial xlPasteValues,xlPasteSpecialOperationNone,True,True
ws.Range("T6:AL6").ClearContents
ws.Range("L6").Select
rs.Close
conn.Close
Set conn = nothing
Set rs = nothing
End Sub
解决方法
Dim sql as string,arr
arr = Array("000165231","000165232","000165239")
sql = "SELECT * FROM database.dbo.table WHERE Col1 IN ('" & Join(arr,"','") & "')"
'use sql variable for your query
使用一维数组:
For i = sRow To fRow
With ws1
If Len(.Cells(i,2).Value) > 0 Then
coll.Add "000" & .Cells(i,4).Value
End If
End With
Next
On Error GoTo gotcha '??
ReDim arr(0 To coll.Count-1)
For i = 1 To coll.Count
arr(i - 1) = coll(i)
Next
'....
ws2.Range("L29").Resize(UBound(arr) + 1,1).Value = Application.Transpose(arr)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。