2015-04-24 142 views
0

我正尝试使用OpenForm函数根据多选列表框中的选项进行过滤。什么是正确的语法呢,还是有更好的方法去做呢?举例来说,让我们假设:Access VBA如何根据多选列表框中的选项筛选记录集?

列表框中有选项Ken,Mike和Sandy。

车有选项Car1,Car2和Car 3.所有车辆都由该列表框中的一个或多个人拥有。

如果选择了某人从列表框中选择,我想打开一个表单,其中包含所选人员拥有的汽车。

谢谢!

+1

那么汽车的桌子/表格每辆车只有一个记录?如果是这样,是否所有业主都列在同一领域?如果不知道关于你打开的窗体的结构必然会回答你的问题是不可能的。 –

+0

我们需要您的数据方案! – EliteRaceElephant

+0

汽车桌每辆汽车和每辆汽车都有一条记录,并且可以有多个人(从人员表)连接到它。该表格有一个用于People的多选列表框,另一个用于双击的文本框,这将打开一个已过滤的汽车表格,只显示已被选中的汽车。请让我知道你是否需要更多信息,谢谢! – Mike

回答

0

行,所以我想出了一个办法做到这一点:

  1. 创建一个字符串来保存查询
  2. 使用for循环来根据每个项目填充串选择
  3. 将这个字符串作为OpenForm命令中的过滤器。

以下是我用于它的特定代码。我在原帖中的例子中使用了汽车和人,但我的实际情况却不同:估算人员和工作分工是过滤器。如果您有相同问题的人,请告诉我您是否有任何问题!因为如果不知道更多关于我想要完成的事情,它可能会令人困惑。

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 
0

使用更清洁和更安全的代码

的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