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

时间:2015-09-23 03:03:31

标签: excel vba combobox

我在Excel中有一个ActiveX控件组合框,它通过框中键入的字符过滤字符串列表,然后用户选择他/她正在搜索的项目。我希望组合框允许输入一个字符,并让用户能够使用键盘上的向上和向上箭头来扫描下拉列表中的项目列表。但是,当用户使用向下箭头键时,下拉列表中的第一个项目被选中,然后是剩下的唯一项目。

此外,我希望能够在下拉列表中使用滚轮(如果可能),并使列表排序,以便在键入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

1 个答案:

答案 0 :(得分:1)

我正在处理同样的问题,最后在Microsoft帮助网站上找到了一些信息,让我可以解决它。 I posted an answer here这似乎对我有用。好像很多我们都遇到过这个问题!答案是我在同一个概念的工作表中使用的精简版本。我认为你的ComboBox被称为priorCmb,所以我将参考那些事件

基本构思涉及组合框所在的工作表中的priorCmb_KeyDown()事件(尽管除了使用KeyPress而不是KeyCode外,其总体行为应与keyAscii相似,所以相应调整)。这可以抓住箭头键按下并设置一个标志。钥匙'通过将KeyCode值设置为0并使用带有priorCmb.ListIndex值的递增/递减来更改选择,可以绕过操作。然后,使用priorCmb_Change()事件中的标志,可以防止ComboBox由于向上和向下箭头而更改链接的单元格值。在KeyDownKeyPress事件结束后,您可以重置标记,以便在需要更改时进行。

我强制更改代码的原因,而不是让它发生在Key_Down事件的末尾(在我的情况下,或者在你的KeyPress),是我可以设置标志并为组合框运行_Change()事件并设置标志以防止更改代码运行。然后在Key事件结束时,我关闭用户的任何其他更改的标志。因为KeyCode在那里是0(或keyAscii等价物),所以它不会在函数末尾运行任何内容,因此不会再次更新代码。

希望有帮助,我找到的帖子的答案中有一个链接,它有一些一般性的想法(虽然专注于UserForms而不是电子表格,所以再次相应调整,尽管我在链接帖子中有关于该帖子的说明)。祝你好运!

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