Я построил поле со списком ActiveX на своем листе , следуя этому руководству , которое выполняет именно то, что я хочу.Из списка имен пользователей все, что вы вводите в поле со списком, начинает мгновенно фильтровать результаты в раскрывающемся списке (который открывается сразу после ввода чего-либо, не требуя нажатия на стрелку раскрывающегося списка, как именно работает пример всвязанный путеводитель).Я пытаюсь воссоздать точно такую же функциональность в пользовательской форме, но есть две вещи, на которых я застрял.Хотя я отлично разбираюсь в формулах, я не очень хорошо разбираюсь в VBA.
Первая проблема - старые результаты зависают. Если я использую цикл для заполнения списка .AddItem
, список не обновляется должным образом, так как вы вводите, и старые значения застряли в списке (не могут быть выделены, и полоса прокрутки не работает), пока вы не нажмете выкл и назадна выпадающий.То же самое происходит, когда у меня нет результатов.Просто позволить ComboBox1.Clear
работать в подпрограмме, как обычно, и Exit Sub
, если моя верхняя ячейка результата не имеет значения, не работает, как я ожидаю;в раскрывающемся списке находятся старые значения, вставленные в него, как и раньше, и он обновляется только после того, как я щелкаю и возвращаюсь в раскрывающийся список (очищается, как и ожидалось).
Как справиться с зависшими результатами в выпадающем менювниз список, когда нет подходящих результатов?Есть ли способ закрыть раскрывающийся список, а затем ComboBox1.DropDown
, чтобы эффективно обновить список так же, как если бы я щелкнул и вернулся в раскрывающийся список?Есть ли какой-то другой метод, который я пропускаю?
Вторая проблема - ComboBox1.List
не работает с 1 или 0 результатами. Если я использую метод ComboBox1.List
для заполнения списка, он будет работать идеально, пока у меня не будет 1 или нет результатов.С 1 результатом или меньше, я получаю ошибку Run-time error '381': Could not set the List property. Invalid property array index.
Я пытался использовать метод ComboBox1.AddItem
только тогда, когда есть 1 результат, но столкнулся с той же проблемой, что и выше.
Есть ли способ узнать значение индекса массива и как-то исправить его, прежде чем он выдаст ошибку?Что может привести к тому, что значение индекса окажется вне допустимого диапазона?Может ли ComboBox1.List
не принимать только 1 значение из диапазона?
Поскольку я получаю наилучшую функциональность с помощью метода ComboBox1.List
, я хотел бы выяснить, почему я получаю ошибку 381,исправить это, а также выяснить, как обращаться с вещами, когда нет соответствующих результатов.Ниже приведен мой код:
Private Sub ComboBox1_Change()
Dim Home As Worksheet: Set Home = Worksheets("Test")
Dim Loc As Variant
Dim LastRow As Long
Home.Cells(3, 2) = Me.ComboBox1.Value 'Same linked cell as the ComboBox on my sheet
If Home.Cells(3, 8).Value <> "" Then 'H3 contains the top result of my filtered list
LastRow = Columns("H").Find("*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows, LookIn:=xlValues).Row
If LastRow = 3 Then '3 means there is only 1 result
Loc = "H3"
Me.ComboBox1.Clear
Else
Loc = "H3:H" & LastRow
End If
Else
Me.ComboBox1.Clear
Exit Sub
End If
Me.ComboBox1.list = Home.Range(Loc).Value
Me.ComboBox1.DropDown
End Sub
ПРИМЕЧАНИЕ. Я инициализирую пользовательскую форму, используя большую часть того же кода, что и выше.Так как я очищаю связанную ячейку и затем беру полный список, чтобы заполнить раскрывающийся список, я не сталкиваюсь с какими-либо проблемами с инициализацией, только с ComboBox1_Change()
.Не уверен, что это актуально, но хотел бы включить и это.