UserForm上的动态组合框-滞留值

时间:2019-01-03 22:49:58

标签: excel vba excel-vba

我在工作表following this guide上建立了一个ActiveX组合框,它完全可以实现我想要的功能。从用户名列表中,无论您在组合框中键入什么内容,都将立即过滤下拉选择中的结果(一旦键入某些内容而无需单击下拉箭头,该选择即会立即打开,该示例将完全按照以下示例操作链接指南)。我正在尝试在UserForm上重新创建完全相同的功能,但是有两件事要坚持。虽然我擅长使用公式,但对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.仅在结果为1时才尝试使用ComboBox1.AddItem方法,但是遇到了与上述相同的问题。

是否可以查看数组索引值是什么,并在引发错误之前以某种方式对其进行纠正?是什么导致索引值超出可接受范围? 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

注意:我使用与上述相同的大多数代码初始化UserForm。由于我清除了链接的单元格,然后获取了完整列表以填充下拉列表,因此初始化不会遇到任何问题,仅会遇到ComboBox1_Change()。不确定是否相关,但也希望包括在内。

0 个答案:

没有答案