Я думаю, что нашел более чистый способ сделать это.Я не осознавал, что вам не нужно указывать рабочий лист для именованного диапазона, даже если диапазоны находятся на отдельном листе. В этом примере "Range1"
и "Range2"
находятся на своем собственном рабочем листе.Кроме того, он работает без объявления ComboBoxes
как объектов.ComboBoxes
имеют имена по умолчанию ComboBox1
, ComboBox2
и ComboBox3
.Пришел к этому решению через Заполнение комбинированного списка из именованных диапазонов
Я уверен, что был бы хороший способ сделать это, вместо создания уникального оператора if
для каждой уникальной ячейки в Range A1:A3
и связанные ComboBox
.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim result As String
Dim search1P As String
Dim search2P As String
search1P = "1P"
search2P = "2P"
If Not Intersect(Target, Range("A1:A3")) Is Nothing Then 'if target is within range A1:A3
result = Target.Value ' set result variable equal to whatever the target cell value is
If Not Intersect(Target, Range("A1")) Is Nothing Then 'if cell A1, evaluate cb1
If InStr(UCase(result), search1P) <> 0 Then 'if result variable contains "1P" then
ComboBox1.ListFillRange = "Range1" 'Populate cb1 with "Range1"
ElseIf InStr(UCase(result), search2P) <> 0 Then 'if result variable contains "2P" then
ComboBox1.ListFillRange = "Range2" 'populate combobox with "Range2"
Else: ComboBox1.ListFillRange = "" 'leave cb blank if source cell is invalid
End If
ElseIf Not Intersect(Target, Range("A2")) Is Nothing Then 'if cell A2, update cb2
If InStr(UCase(result), search1P) <> 0 Then 'if result variable contains "1P" then
ComboBox2.ListFillRange = "Range1" 'Populate cb1 with "Range1"
ElseIf InStr(UCase(result), search2P) <> 0 Then 'if result variable contains "2P" then
ComboBox2.ListFillRange = "Range2" 'populate combobox with "Range2"
Else: ComboBox2.ListFillRange = "" 'leave cb blank if source cell is invalid
End If
ElseIf Not Intersect(Target, Range("A3")) Is Nothing Then 'if cell A2, update cb3
If InStr(UCase(result), search1P) <> 0 Then 'if result variable contains "1P" then
ComboBox3.ListFillRange = "Range1" 'Populate cb1 with "Range1"
ElseIf InStr(UCase(result), search2P) <> 0 Then 'if result variable contains "2P" then
ComboBox3.ListFillRange = "Range2" 'populate combobox with "Range2"
Else: ComboBox3.ListFillRange = "" 'leave cb blank if source cell is invalid
End If
End If
End If
End Sub