我有一个ActiveX组合框,它有一个下拉列表,当用户在组合框中键入字符时,该下拉列表会被填充和过滤。下拉项目来自cLst
。因此下拉列表将会打开,但是一旦用户按下箭头,组合框就会填充第一个下拉项目,下拉列表中的所有其他项目都会消失,因为它会尝试过滤下拉列表中的项目。组合框,它与下拉列表中的一个项目完全匹配(箭头向下突出显示的那个项目)。
如何在向下箭头向下箭头时避免这种自动填充行为,并让用户点击输入他们想要填充组合框的选项?
如果用户避免使用键盘,鼠标可以正常滚动并突出显示,然后单击,只在点击时填充组合框。如果可能的话,我希望滚轮能够滚动下拉列表。
Private Sub newCmb_Change()
filterComboList Tool.newCmb, cLst
End Sub
Private Sub newCmb_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Tool.newCmb.DropDown
End Sub
Private Sub newCmb_GotFocus() 'or _MouseDown()
Tool.newCmb.DropDown
End Sub
Public Sub filterComboList(ByRef cmb As ComboBox, ByRef dLst As Variant)
Dim itm As Variant, lst As String, sel As String, rng As Range
With Worksheets("Database")
Set rng = Application.Intersect(.UsedRange.Rows(2), .Cells.Resize(.Columns.Count - 1).Offset(1))
End With
Application.EnableEvents = False
With cmb
sel = .Value
If IsEmpty(cLst) Then cLst = rng
For Each itm In cLst
If Len(itm) > 1 Then If InStr(1, itm, sel, 1) Then lst = lst & itm & "||"
Next
If Len(lst) > 1 Then .List = Split(Left(lst, Len(lst) - 2), "||") Else .List = dLst
End With
Application.EnableEvents = True
End Sub
答案 0 :(得分:0)
我正在处理同样的问题,最后在Microsoft帮助网站上找到了一些信息,让我可以解决它。 I posted an answer here这似乎对我有用。它是我在同一个概念的工作表中使用的精简版本。
基本思想涉及组合框所在的工作表中的newCmb_KeyDown()
事件(但在整体行为中应该类似于KeyPress
),这会阻止箭头键按下并设置标记。通过将KeyCode
值设置为0并将newCmb.ListIndex
值更改为+/- 1来更改选择,并使用newCmb_Change()
事件中的标记即可取消键的操作由于向上和向下箭头,阻止ComboBox更改链接的单元格值。在KeyDown
或KeyPress
事件结束后,您可以重置标记,以便在需要更改时进行。
希望那些帮助,我找到的线程的答案中有一个链接,它有一些一般的想法(虽然专注于UserForms而不是电子表格)。祝你好运!
**编辑 注意:代码的那些部分似乎在我的工作表中控制了这种行为,但是如果你有一个让它工作的问题,我可以再看看它。