Доступ к VBA. Как я могу отфильтровать набор записей на основе выбора в списке со множественным выбором?
Я пытаюсь использовать функцию OpenForm для фильтрации на основе выбора в списке множественного выбора. каков правильный синтаксис для этого, или есть лучший способ сделать это? Для примера скажем:
В списке есть варианты Кена, Майка и Сэнди.
Автомобиль имеет опции Car1, Car2 и Car 3. Все автомобили принадлежат одному или нескольким людям из этого списка.
Если кто-то из списка выбран, я хотел бы открыть форму, содержащую автомобили, принадлежащие выбранным людям.
Спасибо!
2 ответа
Итак, я нашел способ сделать это:
- Создать строку для хранения запроса
- Используйте цикл For для заполнения строки на основе каждого выбранного элемента
- Поместите эту строку в качестве фильтра в команду 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
Использование функции JOIN для более чистого и безопасного кода
Когда вы неоднократно создаете инкрементные строки SQL с разделителями, такими как "," "И" "ИЛИ", удобно централизовать создание данных массива, а затем использовать функцию 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
Универсальная функция для выбора любых данных столбца из выбранных строк Лисбок может выглядеть следующим образом:
'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