停止自动填充组合框的下拉选择

时间:2015-11-05 16:52:11

标签: excel vba excel-vba combobox

我有一个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

1 个答案:

答案 0 :(得分:0)

我正在处理同样的问题,最后在Microsoft帮助网站上找到了一些信息,让我可以解决它。 I posted an answer here这似乎对我有用。它是我在同一个概念的工作表中使用的精简版本。

基本思想涉及组合框所在的工作表中的newCmb_KeyDown()事件(但在整体行为中应该类似于KeyPress),这会阻止箭头键按下并设置标记。通过将KeyCode值设置为0并将newCmb.ListIndex值更改为+/- 1来更改选择,并使用newCmb_Change()事件中的标记即可取消键的操作由于向上和向下箭头,阻止ComboBox更改链接的单元格值。在KeyDownKeyPress事件结束后,您可以重置标记,以便在需要更改时进行。

希望那些帮助,我找到的线程的答案中有一个链接,它有一些一般的想法(虽然专注于UserForms而不是电子表格)。祝你好运!

**编辑 注意:代码的那些部分似乎在我的工作表中控制了这种行为,但是如果你有一个让它工作的问题,我可以再看看它。