如何在Access查询中获取ListBox控件的数据
Access查询从ListBox获取多选值无结果的解决方法
你的查询无结果的核心原因是:ListBox多选时,Forms![_Teilenummerneingabe3Form]![TestListe]返回的是逗号分隔的字符串,但SQL的In子句需要的是独立的参数列表(比如In ('位置1','位置2')),直接用控件值会被当成单个字符串(比如In ('位置1,位置2')),自然匹配不到数据。
以下是两种可行的解决方法:
方法一:用VBA生成动态查询
编写VBA代码获取ListBox的选中项,拼接成符合SQL语法的参数列表,再更新查询语句:
Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim selectedItems As String Dim i As Integer Set db = CurrentDb() Set qdf = db.QueryDefs("你的查询名称") ' 替换成你实际的查询名 ' 遍历ListBox选中项,拼接带单引号的字符串 For i = 0 To Forms![_Teilenummerneingabe3Form]![TestListe].ListCount - 1 If Forms![_Teilenummerneingabe3Form]![TestListe].Selected(i) Then ' 若位置值含单引号,用Replace转义 selectedItems = selectedItems & "'" & Replace(Forms![_Teilenummerneingabe3Form]![TestListe].Column(0, i), "'", "''") & "', " End If Next i ' 处理拼接后的字符串,更新查询 If Len(selectedItems) > 0 Then selectedItems = Left(selectedItems, Len(selectedItems) - 2) ' 去掉末尾多余的逗号和空格 qdf.SQL = "SELECT DISTINCT [L-Ort1] FROM NeueAbfrageForm WHERE [L-Ort1] In (" & selectedItems & ")" Else ' 无选中项时返回空结果 qdf.SQL = "SELECT DISTINCT [L-Ort1] FROM NeueAbfrageForm WHERE 1=0" End If Set qdf = Nothing Set db = Nothing
你可以把这段代码绑定到按钮的点击事件,点击后再打开报表使用该查询。
方法二:直接在报表中动态设置记录源
既然最终是给标签报表用,也可以跳过单独查询,直接在报表打开时设置记录源:
Private Sub Report_Open(Cancel As Integer) Dim selectedItems As String Dim i As Integer For i = 0 To Forms![_Teilenummerneingabe3Form]![TestListe].ListCount - 1 If Forms![_Teilenummerneingabe3Form]![TestListe].Selected(i) Then selectedItems = selectedItems & "'" & Replace(Forms![_Teilenummerneingabe3Form]![TestListe].Column(0, i), "'", "''") & "', " End If Next i If Len(selectedItems) > 0 Then selectedItems = Left(selectedItems, Len(selectedItems) - 2) Me.RecordSource = "SELECT DISTINCT [L-Ort1] FROM NeueAbfrageForm WHERE [L-Ort1] In (" & selectedItems & ")" Else Cancel = True MsgBox "请选择至少一个位置" End If End Sub
注意事项
- 确认ListBox的绑定列和列索引:代码中
Column(0, i)代表取ListBox第1列的值(索引从0开始),如果你的位置值在其他列,要修改对应的索引数字。 - 若位置字段包含单引号,必须用
Replace方法转义,否则会导致SQL语法错误。
内容的提问来源于stack exchange,提问作者Razer
相关产品推荐
相关产品推荐

