Так что я не уверен, что получаю 100% того, что вы пытаетесь сделать, но вот один из способов сделать это:
Следующий подход предназначен для работы со списком ActiveX.
Для простоты предположим, что у вас есть следующие настройки:
![enter image description here](https://i.stack.imgur.com/tdGsB.jpg)
Значения фильтра находятся в A1:A8
, и вы хотите отфильтровать столбец C по названию дня.
Во-первых, вам нужен сабвуфер, который инициализирует поле со списком. Это может быть расположено в вашем модуле. Как называется sub
, решать вам. Если список необходимо регулярно обновлять, у вас может быть специальная кнопка для этого.
Sub initializeComboBox() 'The name of the Sub is self explanatory
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets("Name of your Worksheet") 'The worksheet where the combobox is located
With sht.OLEObjects("ComboBox1").Object 'Referring to the combobox from outside the worksheet where it's located can be a bit tricky
.Clear 'Clear the combobox's list
.List = sht.Range("A1:A8").Value 'assign the values contained in range A1:A8 to the combobox's list
End With
End Sub
Затем вам нужно событие, которое будет фиксировать изменение значения поля со списком всякий раз, когда пользователь выбирает его. Это должно быть расположено на рабочем листе, к которому относится комбинированный список.
Private Sub ComboBox1_Change() 'This event fires up whenever the user selects an item from the dropdown menu
Dim x As String
x = ComboBox1.Value 'referring to the combobox from inside the worksheet where it belongs is easier
Module1.testFilter (x)
End Sub
Тогда у вас может быть либо sub
, который находится в вашем модуле и вызывается этим событием, либо вы можете просто делать все, что захотите, используя само событие. Я применил первый подход здесь, но это действительно ваш выбор.
Sub testFilter(filterValue As String) 'A sub that is located in the module and applies the filter. This is called whenever the Value of the combobox is changed
Dim sht As Worksheet
Dim rngToBeFiltered As Range
Set sht = ThisWorkbook.Worksheets("Name of your Worksheet") 'The worksheet where the range that needs to be filtered is located
Set rngToBeFiltered = sht.Columns("C")
If filterValue = "No Filter" Then
rngToBeFiltered.AutoFilter field:=1 'If No Filter is selected then all data is displayed
Else
rngToBeFiltered.AutoFilter field:=1, Criteria1:=filterValue 'else the filter is applied
End If
End Sub
Результат бы так:
![enter image description here](https://i.stack.imgur.com/8SLoB.jpg)