Во-первых, поскольку вы неоднократно выполняете одну и ту же операцию для каждого элемента управления формы (в этом случае вы создаете строку с разделителями-запятыми из выбранных элементов), вы можете абстрагировать эту операцию от функции и передавать такую функцию каждому списку.Функция Box.
Например, вы можете определить функцию, такую как:
Function SelectedItems(objBox As ListBox) As String
Dim strRtn As String, varItm
For Each varItm In objBox.ItemsSelected
strRtn = strRtn & ",'" & objBox.ItemData(varItm) & "'"
Next varItm
If strRtn <> vbNullString Then SelectedItems = Mid(strRtn, 2)
End Function
, которая затем может быть оценена с помощью управляющего аргумента List Box и будет возвращать либо пустую строку (""
) или строка с разделителями-запятыми выбранных элементов в списке, например что-то вроде:
?SelectedItems(Forms!Form1!List1)
'A','B'
Более того, поскольку элементы управления вашей формой выглядят непротиворечиво по отношению к полям в вашей таблице,вы можете дополнительно сжать ваш код до следующих строк:
Private Sub Command62_Click()
Dim strSQL As String
Dim strArr As String
Dim varItm
For Each varItm In Array("District", "Circumstance", "Location", "Method", "Point", "Rank")
strArr = SelectedItems(Me.Controls(varItm))
If strArr <> vbNullString Then
strSQL = strSQL & "t." & varItm & " in (" & strArr & ") and "
End If
Next varItm
If strSQL <> vbNullString Then strSQL = "where " & Left(strSQL, Len(strSQL) - 5)
With CurrentDb.QueryDefs("qryMultiselect")
.SQL = "select * from tblDataEntry t " & strSQL
End With
DoCmd.OpenQuery "qryMultiselect"
End Sub
Обратите внимание, что приведенное выше полностью не проверено.
Здесь основной цикл for each
выполняет итерацию по массиву строксоответствующие именам элементов управления вашей формы и именам полей вашей таблицы.
Для каждой формы cУправляя этим массивом, функция получает разделенную запятыми строку выбранных элементов в элементе управления и объединяет ее с существующим кодом SQL, только если был выбран один или несколько элементов.
Как таковой, если нетЕсли элементы выбраны, поле не будет отображаться в предложении SQL where
.
Если был выбран какой-либо фильтр, последние пять символов (and
) обрезаются от конца строки SQL, иКлючевое слово where
объединяется с началом строки SQL - это гарантирует, что, если фильтр не был выбран, результирующий код SQL не будет включать в себя предложение where
.
Наконец, SQL дляопределение запроса обновляется, и запрос открывается в соответствии с вашим исходным кодом.
Если речь идет о текстовых полях, задаче просто нужно пропустить вызов на SelectedItems
и получить значение текстового поля напрямую.
Вот пример со списками и текстовыми полями:
Private Sub Command62_Click()
Dim strSQL As String
Dim strArr As String
Dim varItm
For Each varItm In Array("District", "Circumstance", "Location", "Method", "Point", "Rank")
strArr = vbNullString
Select Case Me.Controls(varItm).ControlType
Case acListBox
strArr = SelectedItems(Me.Controls(varItm))
Case acTextBox
If Not IsNull(Me.Controls(varItm).Value) Then
strArr = "'" & Me.Controls(varItm).Value & "'"
End If
End Select
If strArr <> vbNullString Then
strSQL = strSQL & "t." & varItm & " in (" & strArr & ") and "
End If
Next varItm
If strSQL <> vbNullString Then strSQL = "where " & Left(strSQL, Len(strSQL) - 5)
With CurrentDb.QueryDefs("qryMultiselect")
.SQL = "select * from tblDataEntry t " & strSQL
End With
DoCmd.OpenQuery "qryMultiselect"
End Sub
Надеюсь, это поможет, но учтите, чтоВыше не проверено и только теория.