如何使用combobox keydown事件而不选择列出的项目

时间:2014-11-14 13:46:33

标签: vba excel-vba drop-down-menu combobox keydown

我的Excel VBA项目中有一个组合框,它使用一系列单元格作为项目列表。我在其中使用了一个过滤器,因此无论何时输入值,列表都会缩小到包含该字符串的项目,并显示下拉列表。但是,出现问题,当显示下拉列表时,导航键不能用于在项目内滚动。按下向下键后,下拉列表将再次过滤。

我猜它的发生是因为在关注项目的同时关键,也是选择它。因此,会自动调用combobox_change事件。

有没有办法让我可以自动停止keydown事件选择一个项目,但只能滚动它们?

1 个答案:

答案 0 :(得分:3)

编辑答案:

现在已经构建了我自己的工作表并使用了这些想法,具有讽刺意味的是Application.EnableEnable仅在某些情况下有所帮助,因为Combobox_Change()事件仍会在事件被禁用的情况下触发(或者似乎至少是这种情况) 。我发现的基本思想涉及操纵KeyCodes和设置标志。我下面的示例涉及使用ComboBox TempCombo并在VBA中为TempCombo_KeyDown()事件后运行代码(我已将我的内容修改为示例目的):

Option Explicit
Dim Abort as Boolean

Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
        Case 38  'Up
            If TempCombo.ListIndex <= 0 Then KeyCode = 0 'ignore "Up" press if already on the first selection, or if not on a selection
            Abort = True
            If Not KeyCode = 0 Then ' If on a selection past the first entry
                KeyCode = 0
            'Manually choose next entry, cancel key press
                TempCombo.ListIndex = TempCombo.ListIndex - 1
            End If
            Me.TempCombo.DropDown
        Case 40 'Down
            If TempCombo.ListIndex = TempCombo.ListCount - 1 Then Keycode = 0 
        ' This method was from the discussion I linked, prevents "falling off the bottom of the list"
            Abort = True
            If Not KeyCode = 0 Then ' If on a selection before the last entry
                KeyCode = 0
            'Manually choose next entry, cancel key press
                TempCombo.ListIndex = TempCombo.ListIndex + 1
            End If
            Me.TempCombo.DropDown
    End Select
    Abort = False
End Sub

Private Sub TempCombo_Change()
    If Abort Then Exit Sub ' Stop Event code if flag set
    Abort = True
    ' sets the flag until finished with commands to prevent changes made by code triggering the event multiple times

    ' ~~~ Insert Code you want to run for other cases here ~~~

    Abort = False
End Sub

我在Abort中使用TempCombo_Change()变量作为标志来防止事件代码的多次触发,并且允许键不更改链接单元格的文本结果,从而阻止了我的动态范围来自更新。确保两个子例程都在ComboBox所在的工作表上。

所以这是我为此所做的一个骷髅,如果有人发现问题让我知道,但我希望这可以帮助别人。

  

旧答案

     

我不确定这会有多大帮助,如果我有的话   声誉我只是将其作为评论提交,因为这确实没有   有资格作为答案。但是我遇到了同样的问题而且偶然发现了   一个线程试图回答这个问题。我希望其中一个代码   Microsoft的帮助页面之一:http://answers.microsoft.com/en-us/office/forum/office_2007-customize/disable-userform-combobox-change-event-when-arrow/598b44a1-dcda-4a2c-8e12-2b84762f98ae?db=5

     

看起来向上和向下箭头的KeyDown事件   并与ComboBox_Change事件配对将允许您隔离   它们然后在你上下按压时阻止组合框更新   导航列表。

     

我建议通过OP的后续帖子查看,这是令人难以置信的   提供信息并帮助我适应我自己的情况。   另请注意UserForm与常规Excel VBAcode之间的差异   需要Me.EnableEvents的实例UserForm   一般擅长Application.EnableEvents

     

我知道现在已经老了,但万一这会对任何人有所帮助,祝你好运!