2015-04-24 55 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