有时形式Combobox只显示一行,为什么?

时间:2018-01-19 13:51:08

标签: excel-vba combobox form-control vba excel

我复制了this主题,因为这是一个非常类似的问题,出现在我的表单中。

我有一个表单,其中一个组合框在每次击键的项目列表中执行搜索。问题是,键入时显示的结果列表只有1行,显示在组合框下方。在该字段的右侧,有一个向上/向下箭头滚动按钮。

image

如果我用它来滚动列表,它会显示找到的项目。当我单击组合框的箭头时,带有结果的字段将消失,如果我再次单击箭头,则会显示已执行搜索的结果的完整列表。

image

以下是例程的代码:

Private Sub MiscD_Change()
    Dim v As Variant, i As Long
    With Me.MiscD
        If .Value <> "" And .ListIndex = -1 Then
            v = Range("MiscD").Value
            .Clear  'clear all items

    'Repopulate with matched items
            For i = LBound(v) To UBound(v)
                If LCase(v(i, 1)) Like "*" & LCase(.Value) & "*" Then
                    .AddItem v(i, 1)
                    .DropDown
                End If
            Next i
        Else
            'Repopulate with all items
            .List = Range("MiscD").Value
        End If
    End With
End Sub

似乎ListFillRange在FormControl中不可用。 我检查过.DropDown属性可能会强制显示结果,但我找不到任何结果。

我注意到的其他事情是,通过键盘上的箭头键进行选择是通过原始列表进行选择,而通过单击鼠标进行选择可以获得搜索中的项目列表。

我认为有两个列表,但我不知道搜索中的项目列表存储在哪里,所以我可以用某种方式解决它。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案

我发现.DropDown是在每个循环后实现的,由于某种我不知道的原因而只保留一行。

我所做的是在For循环后移动它,因此检查了所有值并且列表可以完整显示

这是代码

Private Sub MiscD_Change()
    Dim v As Variant, i As Long
    With Me.MiscD
        If .Value <> "" And .ListIndex = -1 Then
            v = Range("MiscD").Value
            .Clear  'clear all items
            MiscDe.SetFocus
            MiscD.SetFocus

    'Repopulate with matched items
            For i = LBound(v) To UBound(v)
                If LCase(v(i, 1)) Like "*" & LCase(.Value) & "*" Then
                    .AddItem v(i, 1)
                End If
            Next i
            .DropDown
        Else
            'Repopulate with all items
            .List = Range("MiscD").Value
        End If
    End With
End Sub

当我在组合框中更改搜索条件时,我使用SetFocus隐藏并显示下拉字段。

这有点笨拙,所以如果有人能想出更好的方式,那将会有所帮助。