Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从自动填充组合框中停止下拉选择_Vba_Excel_Combobox - Fatal编程技术网

Vba 从自动填充组合框中停止下拉选择

Vba 从自动填充组合框中停止下拉选择,vba,excel,combobox,Vba,Excel,Combobox,我有一个ActiveX组合框,它有一个下拉列表,当用户在组合框中键入字符时,该下拉列表将被填充和过滤。下拉项来自cLst。因此下拉列表将打开,但一旦用户按下箭头,组合框就会填充第一个下拉列表项,并且下拉列表中的所有其他项都会消失,因为它会尝试按组合框中的项过滤下拉列表,这与下拉列表中的一个项目完全匹配,即箭头向下时突出显示的项目 当向下箭头指向下拉列表时,如何避免这种自动填充行为,并让用户在要填充组合框的选择上按enter键 如果用户避免使用键盘,鼠标可以很好地滚动并高亮显示,然后单击,并且仅在

我有一个ActiveX组合框,它有一个下拉列表,当用户在组合框中键入字符时,该下拉列表将被填充和过滤。下拉项来自cLst。因此下拉列表将打开,但一旦用户按下箭头,组合框就会填充第一个下拉列表项,并且下拉列表中的所有其他项都会消失,因为它会尝试按组合框中的项过滤下拉列表,这与下拉列表中的一个项目完全匹配,即箭头向下时突出显示的项目

当向下箭头指向下拉列表时,如何避免这种自动填充行为,并让用户在要填充组合框的选择上按enter键

如果用户避免使用键盘,鼠标可以很好地滚动并高亮显示,然后单击,并且仅在单击时填充组合框。我想滚轮工作,如果可能的话,滚动通过下拉列表

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

我当时也在处理同样的问题,最后在一个微软帮助网站的帖子上找到了一些信息,让我可以随意使用它。这似乎对我有用。这是一个精简版本的什么,我用在一张纸上为这个相同的概念

基本思想涉及newCmb_KeyDown事件,但在组合框所在的工作表中,其整体行为应类似于按键,这会阻碍箭头键的按下并设置标志。通过将KeyCode值设置为0并将newCmb.ListIndex值更改+/-1以更改选择,并在newCmb_更改事件中使用标志,可以取消键的操作,从而防止组合框由于上下箭头而更改链接的单元格值。当您到达KeyDown或KeyPress事件的末尾时,您可以在希望发生更改时重置标志

希望这些帮助,在我找到的线索的答案中有一个链接,它有一些一般的想法,尽管重点是用户表单而不是电子表格。祝你好运

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