访问 VBA 如何根据多 select 列表框中的 select 离子过滤记录集?
Access VBA How can I filter a recordset based on the selections in a multi select list box?
我正在尝试使用 OpenForm 函数根据多 select 列表框中的 select 离子进行过滤。正确的语法是什么,或者有更好的方法吗?为了举例,我们说:
列表框有 Ken、Mike 和 Sandy 选项。
汽车有选项 Car1、Car2 和 Car 3。所有汽车都由该列表框中的 1 人或多人拥有。
如果列表框中的某个人被 selected,我想打开一个表格,其中包含这些人 selected 拥有的汽车。
谢谢!
好的,所以我想出了一个办法:
- 创建一个字符串来保存查询
- 使用 For 循环根据所选的每个项目填充字符串
- 将该字符串作为过滤器放入 OpenForm 命令中。
这是我习惯的具体代码。我在原始 post 中的示例使用了 Cars 和 People,但我的实际上下文不同:Estimators 和 Division of Work 是过滤器。如果您是有相同问题的人,如果您对此有任何疑问,请告诉我!因为如果不了解我到底想完成什么,可能会造成混淆。
Dim strQuery As String
Dim varItem As Variant
'query filtering for estimators and division list box selections
strQuery = ""
If Me.EstimatorList.ItemsSelected.Count + Me.DivisionList.ItemsSelected.Count > 0 Then
For Each varItem In Me.EstimatorList.ItemsSelected
strQuery = strQuery + "[EstimatorID]=" & varItem + 1 & " OR "
Next varItem
If Me.EstimatorList.ItemsSelected.Count > 0 And Me.DivisionList.ItemsSelected.Count > 0 Then
strQuery = Left(strQuery, Len(strQuery) - 4)
strQuery = strQuery + " AND "
End If
For Each varItem In Me.DivisionList.ItemsSelected
strQuery = strQuery + "[DivisionID]=" & varItem + 1 & " OR "
Next varItem
strQuery = Left(strQuery, Len(strQuery) - 4)
End If
使用 JOIN 函数获得更干净、更安全的代码
当您发现自己反复构建增量 SQL 带有分隔符(如“,”)的字符串时 "AND" "OR" 集中生成数组数据然后使用 VBA Join(array, delimiter) 函数。
如果感兴趣的键在数组中,则用户从多选列表框中进行选择以构建表单过滤器 SQL WHERE 片段 属性 可能如下所示:
Private Sub lbYear_AfterUpdate()
Dim strFilter As String
Dim selction As Variant
selction = ListboxSelectionArray(lbYear, lbYear.BoundColumn)
If Not IsEmpty(selction) Then
strFilter = "[Year] IN (" & Join(selction, ",") & ")"
End If
Me.Filter = strFilter
If Not Me.FilterOn Then Me.FilterOn = True
End Sub
从选定的 lisbok 行中选取任何列数据的通用函数可能如下所示:
'Returns array of single column data of selected listbox rows
'Column index 1..n
'If no items selected array will be vbEmpty
Function ListboxSelectionArray(lisbox As ListBox, Optional columnindex As Integer = 1) As Variant
With lisbox
If .ItemsSelected.Count > 0 Then
Dim str() As String: ReDim str(.ItemsSelected.Count - 1)
Dim j As Integer
For j = 0 To .ItemsSelected.Count - 1
str(j) = CStr(.Column(columnindex - 1, .ItemsSelected(j)))
Next
ListboxSelectionArray = str
Else
ListboxSelectionArray = vbEmpty
End If
End With
End Function
几个数组构建器在应用程序库和编码中可以看起来更多VB.NET
我正在尝试使用 OpenForm 函数根据多 select 列表框中的 select 离子进行过滤。正确的语法是什么,或者有更好的方法吗?为了举例,我们说:
列表框有 Ken、Mike 和 Sandy 选项。
汽车有选项 Car1、Car2 和 Car 3。所有汽车都由该列表框中的 1 人或多人拥有。
如果列表框中的某个人被 selected,我想打开一个表格,其中包含这些人 selected 拥有的汽车。
谢谢!
好的,所以我想出了一个办法:
- 创建一个字符串来保存查询
- 使用 For 循环根据所选的每个项目填充字符串
- 将该字符串作为过滤器放入 OpenForm 命令中。
这是我习惯的具体代码。我在原始 post 中的示例使用了 Cars 和 People,但我的实际上下文不同:Estimators 和 Division of Work 是过滤器。如果您是有相同问题的人,如果您对此有任何疑问,请告诉我!因为如果不了解我到底想完成什么,可能会造成混淆。
Dim strQuery As String
Dim varItem As Variant
'query filtering for estimators and division list box selections
strQuery = ""
If Me.EstimatorList.ItemsSelected.Count + Me.DivisionList.ItemsSelected.Count > 0 Then
For Each varItem In Me.EstimatorList.ItemsSelected
strQuery = strQuery + "[EstimatorID]=" & varItem + 1 & " OR "
Next varItem
If Me.EstimatorList.ItemsSelected.Count > 0 And Me.DivisionList.ItemsSelected.Count > 0 Then
strQuery = Left(strQuery, Len(strQuery) - 4)
strQuery = strQuery + " AND "
End If
For Each varItem In Me.DivisionList.ItemsSelected
strQuery = strQuery + "[DivisionID]=" & varItem + 1 & " OR "
Next varItem
strQuery = Left(strQuery, Len(strQuery) - 4)
End If
使用 JOIN 函数获得更干净、更安全的代码
当您发现自己反复构建增量 SQL 带有分隔符(如“,”)的字符串时 "AND" "OR" 集中生成数组数据然后使用 VBA Join(array, delimiter) 函数。
如果感兴趣的键在数组中,则用户从多选列表框中进行选择以构建表单过滤器 SQL WHERE 片段 属性 可能如下所示:
Private Sub lbYear_AfterUpdate()
Dim strFilter As String
Dim selction As Variant
selction = ListboxSelectionArray(lbYear, lbYear.BoundColumn)
If Not IsEmpty(selction) Then
strFilter = "[Year] IN (" & Join(selction, ",") & ")"
End If
Me.Filter = strFilter
If Not Me.FilterOn Then Me.FilterOn = True
End Sub
从选定的 lisbok 行中选取任何列数据的通用函数可能如下所示:
'Returns array of single column data of selected listbox rows
'Column index 1..n
'If no items selected array will be vbEmpty
Function ListboxSelectionArray(lisbox As ListBox, Optional columnindex As Integer = 1) As Variant
With lisbox
If .ItemsSelected.Count > 0 Then
Dim str() As String: ReDim str(.ItemsSelected.Count - 1)
Dim j As Integer
For j = 0 To .ItemsSelected.Count - 1
str(j) = CStr(.Column(columnindex - 1, .ItemsSelected(j)))
Next
ListboxSelectionArray = str
Else
ListboxSelectionArray = vbEmpty
End If
End With
End Function
几个数组构建器在应用程序库和编码中可以看起来更多VB.NET