Динамический ComboBox на UserForm - Застрявшие значения - PullRequest
0 голосов
/ 04 января 2019

Я построил поле со списком 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().Не уверен, что это актуально, но хотел бы включить и это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...