我正尝试使用OpenForm函数根据多选列表框中的选项进行过滤。什么是正确的语法呢,还是有更好的方法去做呢?举例来说,让我们假设:Access VBA如何根据多选列表框中的选项筛选记录集?
列表框中有选项Ken,Mike和Sandy。
车有选项Car1,Car2和Car 3.所有车辆都由该列表框中的一个或多个人拥有。
如果选择了某人从列表框中选择,我想打开一个表单,其中包含所选人员拥有的汽车。
谢谢!
我正尝试使用OpenForm函数根据多选列表框中的选项进行过滤。什么是正确的语法呢,还是有更好的方法去做呢?举例来说,让我们假设:Access VBA如何根据多选列表框中的选项筛选记录集?
列表框中有选项Ken,Mike和Sandy。
车有选项Car1,Car2和Car 3.所有车辆都由该列表框中的一个或多个人拥有。
如果选择了某人从列表框中选择,我想打开一个表单,其中包含所选人员拥有的汽车。
谢谢!
行,所以我想出了一个办法做到这一点:
以下是我用于它的特定代码。我在原帖中的例子中使用了汽车和人,但我的实际情况却不同:估算人员和工作分工是过滤器。如果您有相同问题的人,请告诉我您是否有任何问题!因为如果不知道更多关于我想要完成的事情,它可能会令人困惑。
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字符串中包含分隔符“”‘和’‘或’可以很方便地集中生产的数组数据,然后使用VBA Join(数组,分隔符)函数。
如果有趣的钥匙在一个阵列,从多选列表框的用户选择建立一个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
那么汽车的桌子/表格每辆车只有一个记录?如果是这样,是否所有业主都列在同一领域?如果不知道关于你打开的窗体的结构必然会回答你的问题是不可能的。 –
我们需要您的数据方案! – EliteRaceElephant
汽车桌每辆汽车和每辆汽车都有一条记录,并且可以有多个人(从人员表)连接到它。该表格有一个用于People的多选列表框,另一个用于双击的文本框,这将打开一个已过滤的汽车表格,只显示已被选中的汽车。请让我知道你是否需要更多信息,谢谢! – Mike