Как отфильтровать данные на основе выборок из двух отдельных comboxes в пользовательской форме

#excel #vba

#excel #vba

Вопрос:

У меня есть пользовательская форма с двумя блоками со списком (год и единица измерения). У меня есть большой набор данных, который я хочу отфильтровать на основе выборки из обоих списков со списком, т. Е. Я выбираю Year = 2013, Unit = 20A, я хочу, чтобы он отфильтровывал все данные с этими двумя идентифицирующими ссылками.

Я пробовал зависимые списки со списком, но безрезультатно.

Единственный код, который у меня есть на данный момент, — это заполнить поля со списком.

 Private Sub UserForm_Initialize()

 Dim N As Long, i As Long
    With Sheets("LookUpLists")
        N = .Cells(Rows.Count, 1).End(xlUp).row
        O = .Cells(Rows.Count, 2).End(xlUp).row

    End With

    With cboYear
        .Clear
        For i = 1 To N
            .AddItem Sheets("LookUpLists").Cells(i   1, 1).Value
        Next i
    End With

    With cboUnit
        .Clear
        For i = 1 To O
            .AddItem Sheets("LookUpLists").Cells(i   1, 2).Value
        Next i
    End With
End Sub
  

Ответ №1:

Итак, исходя из моего понимания вашего вопроса, это не должно быть слишком сложно. Вы можете получить значение полей со списком, используя CboYear.Value и cboUnit.Value . Затем вы можете использовать with блок с диапазоном ваших листов и использовать два, .autofilter ссылающихся на соответствующий, field:= являющийся вашим фильтруемым столбцом и Criteria1:=RespectiveComboBox.Value содержащий выбор combobox. Обратите внимание, что отсутствие выбора ни в одном из полей, скорее всего, приведет к ошибке. Также подумайте о том, чтобы поместить условие фильтрации в ComboBox_Change() событие, чтобы убедиться, что оно обновляется каждый раз, когда вы меняете выборку.

 Option Explicit

Private Sub cboYear_Change()

With Sheets("LookUpLists").Range("A1:AZ100") 'replace with an appropriate range
    .AutoFilter field:=2, Criteria1:=cboYear.Value 'edit to appropriate field
    .AutoFilter field:=3, Criteria1:=cboUnit.Value 'edit to appropriate field
End With

End Sub

Private Sub cboUnit_Change()

With Sheets("LookUpLists").Range("A1:AZ100") 'replace with an appropriate range
    .AutoFilter field:=2, Criteria1:=cboYear.Value 'edit to appropriate field
    .AutoFilter field:=3, Criteria1:=cboUnit.Value 'edit to appropriate field
End With

    End Sub
  

Отдельное примечание: вы всегда должны использовать Option Explicit в верхней части своих модулей. Вы можете включить это автоматически в VBA -> tools. Это поможет вам найти ошибки (например, не объявлять O с помощью Dim инструкции)

Комментарии:

1. Спасибо! Это именно то, что я искал.

2. Дружественная подсказка: исправлено написание Criteria1 параметров в обоих подразделах 🙂