Доступ к VBA. Как я могу отфильтровать набор записей на основе выбора в списке со множественным выбором?

Я пытаюсь использовать функцию OpenForm для фильтрации на основе выбора в списке множественного выбора. каков правильный синтаксис для этого, или есть лучший способ сделать это? Для примера скажем:

В списке есть варианты Кена, Майка и Сэнди.

Автомобиль имеет опции Car1, Car2 и Car 3. Все автомобили принадлежат одному или нескольким людям из этого списка.

Если кто-то из списка выбран, я хотел бы открыть форму, содержащую автомобили, принадлежащие выбранным людям.

Спасибо!

2 ответа

Решение

Итак, я нашел способ сделать это:

  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

Использование функции 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

Другие вопросы по тегам