停止combobox向下箭头自动select

我在Excel中有一个ActiveX控件combobox,它将filter按string键入的string列表,然后用户select他/她正在search的项目。 我希望combobox允许input一个字符,让用户能够使用键盘上的向下和向上箭头扫描下拉菜单中的项目列表。 但是,当用户使用向下箭头键时,下拉列表中的第一个项目被选中,然后是唯一剩下的项目。

此外,我希望能够在下拉列表中使用滚轮(如果可能的话),并具有列表sorting,以便在am,inputam,首先显示以a开头的项目。

请让我知道,如果有什么我可以做,以避免这种行为。

这是combobox的代码:

 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 

我正在处理相同的问题,最终在Microsoft帮助站点线程上find了一些信息,这些信息让我可以充分利用它。 我在这里贴了一个答案 ,似乎为我工作。 好像有一堆我们有这个问题! 答案是我在同一个概念的表格中使用的简化版本。 我认为你的ComboBox被称为priorCmb ,所以我要引用这个事件

基本的想法涉及combobox所在表中的priorCmb_KeyDown()事件(尽pipe除了使用KeyCode而不是keyAscii之外,应该与整体行为中的KeyPress类似,所以相应地适应)。 这可以抓住箭头键按下并设置一个标志。 通过将KeyCode值设置为0并使用与priorCmb.ListIndex值的递增/递减来改变select,可以绕过键的操作。 然后,使用priorCmb_Change()事件中的标志,可以防止combobox由于向上和向下箭头而更改链接的单元格值。 一旦您到达KeyDownKeyPress事件的结束位置,您可以重置标志,以便在发生更改时进行更改。

我强迫代码中的变化,而不是让它发生在Key_Down事件(在我的情况,或在你的KeyPress )结束的原因是我可以设置标志并运行combobox_Change()事件将标志设置为防止更改代码运行。 然后在Key事件结束时,我closures了用户的任何其他更改的标志。 因为KeyCode是0(或keyAscii等效),所以它不会在函数的末尾运行任何东西,因此不会再次更新代码。

希望有帮助,这个答案有一个链接,我发现,有一些一般的想法(虽然侧重于用户窗体,而不是电子表格,所以再次适应相应的,虽然我有一个关于链接的post说明)的线索。 祝你好运!

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