Excel 向下箭头时停止组合框自动选择

Excel 向下箭头时停止组合框自动选择,excel,vba,combobox,Excel,Vba,Combobox,我在Excel中有一个ActiveX控件组合框,它根据框中键入的字符筛选字符串列表,然后用户在其中选择要搜索的项。我希望combobox允许输入字符,并让用户能够使用键盘上的向下和向上箭头扫描下拉列表中的项目。但是,当用户使用向下箭头键时,将选择下拉列表中的第一个项目,然后是剩余的唯一项目 此外,如果可能,我希望能够在下拉列表中使用滚轮,并对列表进行排序,以便在键入am时,首先显示以a开头的项目 请让我知道我是否可以做些什么来避免这种行为 以下是组合框的代码: Private Sub Works

我在Excel中有一个ActiveX控件组合框,它根据框中键入的字符筛选字符串列表,然后用户在其中选择要搜索的项。我希望combobox允许输入字符,并让用户能够使用键盘上的向下和向上箭头扫描下拉列表中的项目。但是,当用户使用向下箭头键时,将选择下拉列表中的第一个项目,然后是剩余的唯一项目

此外,如果可能,我希望能够在下拉列表中使用滚轮,并对列表进行排序,以便在键入
am时,首先显示以
a
开头的
项目

请让我知道我是否可以做些什么来避免这种行为

以下是组合框的代码:

Private Sub Worksheet_SelectionChangePrior(ByVal Target As Range)
    cLstPrior = Application.Transpose(Database.UsedRange.Columns(1)) 'set module-level variable
    Tool.priorCmb.List = cLstPrior        'initialize ComboBox to range Col A (UsedRange only)
    Tool.priorCmb.ListIndex = -1     'set ComboBox value to empty
End Sub

Private Sub priorCmb_Change()
   filterComboListPrior Tool.priorCmb, cLstPrior
End Sub

Private Sub priorCmb_KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    Tool.priorCmb.DropDown
End Sub

Private Sub priorCmb_GotFocus()   'or _MouseDown()
    Tool.priorCmb.DropDown
End Sub

Public Sub filterComboListPrior(ByRef cmbPrior As ComboBox, ByRef dLstPrior As Variant)
    Dim itmPrior As Variant, lstPrior As String, selPrior As String

    Application.EnableEvents = False
    With cmbPrior
        selPrior = .Value
        If IsEmpty(cLstPrior) Then cLstPrior = Database.UsedRange.Columns(1)
        For Each itmPrior In cLstPrior
            If Len(itmPrior) > 1 Then If InStr(1, itmPrior, selPrior, 1) Then lstPrior = lstPrior & itmPrior & "||"
        Next
        If Len(lstPrior) > 1 Then .List = Split(Left(lstPrior, Len(lstPrior) - 2), "||") Else .List = dLstPrior
    End With
    Application.EnableEvents = True

End Sub

我当时也在处理同样的问题,最后在一个微软帮助网站的帖子上找到了一些信息,让我可以随意使用它。这似乎对我有用。似乎我们中的很多人都有这个问题!答案是我在同一个概念的表格中使用的精简版本。我认为您的组合框名为
priorCmb
,因此我将在事件中引用它

基本思想涉及组合框所在的工作表中的
priorCmb\u KeyDown()
事件(尽管在整体行为上应该类似于
KeyPress
,除了使用
KeyCode
而不是
keyacii
,因此进行相应调整)。这可以抓住箭头键并设置一个标志。通过将
KeyCode
值设置为0并使用
priorCmb.ListIndex
值的增量/减量来更改选择,可以绕过键的操作。然后,使用
priorCmb_Change()
事件中的标志,可以防止组合框由于上下箭头而更改链接的单元格值。在
KeyDown
KeyPress
事件结束后,您可以在希望发生更改时重置标志

我之所以强制更改代码,而不是让它发生在
Key\u Down
事件结束时(在我的例子中,或者在你的例子中是
KeyPress
),是因为我可以设置标志并在设置标志的情况下为组合框运行
\u change()
事件,以防止更改代码运行。然后,在
事件结束时,我关闭了用户的任何其他更改的标志。由于那里的
KeyCode
为0(或相当于
keyacii
),因此它不会在函数结束时运行任何操作,因此不会再次更新代码

希望这能有所帮助,在我找到的线索的答案中有一个链接,它有一些一般性的想法(虽然关注的是用户表单而不是电子表格,所以再次进行相应的调整,尽管我在链接的帖子中有一条关于这一点的注释)。祝你好运

注意:在我的工作表中,这些代码部分似乎控制了这种行为,但如果您在使其工作时遇到问题,我可以再看一次