使用访问VBA在SQL语句的WHERE子句中使用数组

时间:2014-04-25 19:58:18

标签: vba access-vba

我有一个数组ListBoxContents(),它将包含像' 15',' 16',' 25' ...最多10个项目。我试图在 Bnumber 列中检索数据,其中长度> 6的数据以及(' 15',' 16',& #39; 25' ...)即列表框中指定的那些项目。并尝试在sql语句的cluase中查询这些列表框项目

表格列Bnumber包含

 Bnumber
152
156
1523
16417
AA454
CC654
18A16
1826
18A16
25A76
54A16
54235A68

我的VBA代码

Private Sub arraywhere()
Dim qry As String 
Dim Size As Integer
Size = Form_Input_From.lstdigits.ListCount - 1
ReDim ListBoxContents(0 To Size) As String
ReDim LContents(0 To 30) As String       
Dim m As Integer    
For m = 0 To Size
    ListBoxContents(m) = Form_Input_From.lstdigits.ItemData(m)
Next m  


For m = 0 To Size
     qry = "SELECT col1,col2,Bnumber " & _
    "FROM table WHERE (Len([table].[Bnumber]))>6) AND (Left
     ([table].[Bnumber],2))=(" & ListBoxContents(m) & ");"
Next m   

Debug.Print qry    

Application.CurrentDb.QueryDefs("[arrayqry]").sql = qry
DoCmd.OpenQuery "[arrayqry]"

End Sub

但我的WHERE子句只读取最后一个数组项。我如何在where子句中指定数组?

4 个答案:

答案 0 :(得分:5)

尝试类似

的内容
" ...  ([table].[Bnumber],2)) in ('" & Join(ListBoxContents,"','") & "');"

答案 1 :(得分:0)

您正在将qry设置为for循环的每次迭代的新语句。相反,您需要根据列表框内容(见("x", "y", "z"))连接字符串,并将=替换为in

完成设置一次后,它将类似于:

qry = "SELECT col1,col2,Bnumber " & _
"FROM table WHERE (Len([table].[Bnumber]))>6) AND (Left
 ([table].[Bnumber],2)) in (" & commaSeperatedContents & ");"

其中commaSeperatedContents是一个类似("x", "y", "z")的字符串,但当然有您的值。

答案 2 :(得分:0)

试试这个:

Dim inPart As String

For m = 0 To Size
    inPart = inPart & "'" & ListBoxContents(m) & "',"
Next m
inPart = Left(inPart, Len(inPart) - 1)

qry = "SELECT col1,col2,Bnumber " & _
   "FROM [table] WHERE Len([table].[Bnumber])>6 AND " & _
   "Left([table].[Bnumber],2) In (" & inPart & ");"
Debug.Print qry

CurrentDb.QueryDefs("[arrayqry]").SQL = qry
DoCmd.OpenQuery "arrayqry"

答案 3 :(得分:0)

数组中的项目列表实际上似乎来自Form_Import_From_PMT.lstdigits控件。此控件是否绑定到数据源?如果是这样,您只需使用join子句将table加入该数据源,该子句指定只选择以Bnumber值开头的行,这些值以连接表中的数字开头:

select col1, col2, Bnumber
from table as t
inner join tblDigits as d
on left(t.Bnumber, 2) = d.Digits
where len(t.Bnumber) > 6

如果控件绑定到数据源,则立即绑定它(创建一个新表tblDigits来保存数字,如上所示),你将成为能够使用上述查询。

简而言之,数据绑定是指在Access中的where子句中使用数组的方式。