Вы подходите к нему правильно, сортируете или фильтруете данные своего списка перед загрузкой списка. Я запутался в вашем вопросе, но, похоже, вам интересно, как создать выпадающий список проверки данных после того, как вы манипулировали своим списком?
Вот пример того, как это делается с помощью простого тестового кода, написанного для построения списка состояний, а затем списка округов на основе выбранного состояния. Может быть, это поможет вам создать списки проверки.
Существует две таблицы:
1) один для элементов списка данных ThisWorkbook.Worksheets ("DataList")
2) один для выпадающих списков ThisWorkbook.Worksheets ("DD Report Testing")
В модуле Create_State_List
Option Explicit
'This is a two part validation, select a state and then select a county
Sub CreateStateList()
Dim FirstDataRow As Double, LastDataRow As Double
Dim StateCol As Double, CountyCol As Double
Dim DataListSht As Worksheet
Dim DDReportSht As Worksheet
Dim StateListLoc As String
Dim StateRange As Range
Set DataListSht = ThisWorkbook.Worksheets("DataList")
Set DDReportSht = ThisWorkbook.Worksheets("DD Report Testing")
FirstDataRow = 3 'First row with a State
StateCol = 2 'States are in Col 2 ("B")
LastDataRow = DataListSht.Cells(DataListSht.Rows.Count, StateCol).End(xlUp).Row
Set StateRange = DataListSht.Range(DataListSht.Cells(FirstDataRow, StateCol), DataListSht.Cells(LastDataRow, StateCol))
StateListLoc = "D3" 'This is where the drop down is located / will be updated
DDReportSht.Range(StateListLoc).ClearContents 'Clear the list as we build dynamically
DDReportSht.Range(StateListLoc).Validation.Delete 'Clear the Validation
'Create the State List
With Range(StateListLoc).Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=DataList!" & StateRange.Address
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub
В модуле Create_County_List
Option Explicit
Private Sub CreateCountyList(StateChosen As String)
Dim DataListSht As Worksheet
Dim DDReportSht As Worksheet
Dim StateRow As Double
Dim NumStateCols As Double
Dim StartStateCol As Double
Dim i As Integer
Dim LastDataRow As Double
Dim CountyRange As Range
Dim CountyListLoc As String
Set DataListSht = ThisWorkbook.Worksheets("DataList")
Set DDReportSht = ThisWorkbook.Worksheets("DD Report Testing")
NumStateCols = 51 'We count the District of Columbia
StateRow = DataListSht.Range("C2").Row
StartStateCol = DataListSht.Range("C2").Column
For i = 0 To NumStateCols 'Account for starting at zero rather than 1
If CStr(Trim(DataListSht.Cells(StateRow, StartStateCol + i))) = StateChosen Then
'find the last Data row in the column where the match is
LastDataRow = DataListSht.Cells(DataListSht.Rows.Count, StartStateCol + i).End(xlUp).Row
'Make the Dynamic list of Counties based on the state chosen
Set CountyRange = DataListSht.Range(DataListSht.Cells(StateRow + 1, StartStateCol + i), DataListSht.Cells(LastDataRow, StartStateCol + i))
CountyListLoc = "D4"
DDReportSht.Range(CountyListLoc).ClearContents
DDReportSht.Range(CountyListLoc).Validation.Delete
'Create the County List
With Range(CountyListLoc).Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=DataList!" & CountyRange.Address
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
'Break loop
i = 1000 ' should break loop off right here
Else 'do not build a list
End If
Next i
End Sub
Рабочий лист содержит код выбора ячейки
Option Explicit
'This routine will react to changes to a cell in the worksheet
Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim DDReportSht As Worksheet
Dim StateString As String
Set DDReportSht = ThisWorkbook.Worksheets("DD Report Testing")
Call CheckStatusBar 'Lets update the Status bar on selection changes
'If the cell change is D3 on DD report (they want state so build list for state)
If Not Intersect(Target, DDReportSht.Range("D3")) Is Nothing Then
'Clear the county list until the state is chosen to avoid mismatch
DDReportSht.Range("D4").ClearContents
DDReportSht.Range("D4").Validation.Delete
'*** Create the State Drop Down
Call CreateStateList
Else 'Do nothing
End If
'If the cell change is D4 on DD report (they want the county list so build it based on the state in D3)
If Not Intersect(Target, DDReportSht.Range("D4")) Is Nothing Then
'If there was a change to the state list go get the county list set up
StateString = DDReportSht.Range("D3")
Application.Run "Create_County_List.CreateCountyList", StateString
Else 'Do nothing
End If
'If cell is D7 build a rig list
If Not Intersect(Target, DDReportSht.Range("D7")) Is Nothing Then
'Build the Rig List
Call CreateRigList
Else 'Do nothing
End If
End Sub
DataSet:
![enter image description here](https://i.stack.imgur.com/ZQWMr.png)
Test Validation Worksheet на практике, опять же, это просто демонстрация:
![enter image description here](https://i.stack.imgur.com/5iqW8.png)