我在工作表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()
。不确定是否相关,但也希望包括在内。