Цикл по спискам ActiveX ComboBox на листе и присвоение именованного диапазона списку - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть столбцы A и B. Каждая ячейка в столбце B содержит activeX ComboBox. Я хочу, чтобы ComboBox в столбце B заполнялся со ссылкой на именованный диапазон из другого листа на основе ввода в столбце A (непосредственно рядом со списком)

Для этого мне нужно выполнить цикл по каждому ComboBox на листе с вложенными операторами IF, но не могу понять, как выполнить цикл по объектам поля со списком, а затем назначить именованный диапазон для поля со списком, если другие условия верны.

Для простоты ячейка A1 будет рядом с ComboBox1. Ячейка A2 будет рядом с ComboBox2 и т. Д.

Базовый пример:

myRange1 = ActiveWorkbook.Worksheets("Ranges").Range("NamedRange1")
myRange2 = ActiveWorkbook.Worksheets("Ranges").Range("NamedRange2")
i = 1

For Each ComboBox on ActiveWorksheet

If Cell("A" & i) 'condition1 here' Then
ComboBoxi.ListFillRange = myRange1
i = i+1
Elseif Cell("A" & i) 'condition2 here' Then
ComboBox'i'.ListFillRange = myRange2
i = i+1
Else 'do nothing

Next

1 Ответ

0 голосов
/ 11 апреля 2019

Я думаю, что нашел более чистый способ сделать это.Я не осознавал, что вам не нужно указывать рабочий лист для именованного диапазона, даже если диапазоны находятся на отдельном листе. В этом примере "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
...