在Excel中键入下拉列表时自动完成,其中列表使用VBA填充

时间:2016-05-20 12:06:10

标签: excel vba excel-vba

我使用以下代码将数据插入另一个工作表的下拉列表中。当用户从另一个下拉列表中选择某个选项时,就可以实现这一点。

lstRow = Sheets("Data Sheet").Range("D" & Rows.Count).End(xlUp).Row
Sheets("Data Insert").Range("C3").Select
With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="='Associated British Ports'!$G$7:$G" & lstRow
    .IgnoreBlank = False
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = "Invalid Selection"
    .InputMessage = ""
    .ErrorMessage = _
    "Please select a user from the list or select New User as the configuration type."
    .ShowInput = True
    .ShowError = True
End With

我想添加一个功能,当用户键入几个字母时,它会搜索列表并删除任何不包含该内容的内容。 I.E.说我在下拉列表中有以下内容: 托马斯 史密斯 格雷厄姆 埃文斯 大卫 B matthews

用户输入" th" 其余值应为

托马斯 史密斯 B matthews

即使是简化版本,用户也必须以A Th的形式输入名称。如果以上内容不可行,则返回A Thomas就可以了。

我看过这个http://www.ozgrid.com/Excel/autocomplete-validation.htmExcel data validation with suggestions/autocomplete

但我不认为我不确定如何将其与上述代码集成,或者甚至可能!

有人可以帮帮我吗?

TIA:)

1 个答案:

答案 0 :(得分:2)

这是我的SAYT(按键搜索)功能。我的表单有一个列表框控件,其中包含一个用户列表和一个可用于搜索列表的文本框控件。

Private Sub txtSearch_Change()
    Dim x As Integer

    lstUsers.ListIndex = -1
    For x = 0 To lstUsers.ListCount - 1
        lstUsers.ListIndex = x
        If InStr(1, LCase(lstUsers.Text), LCase(txtSearch.Text), vbTextCompare) > 0 _
        Or InStr(1, LCase(lstUsers.List(x, 1)), LCase(txtSearch.Text), vbTextCompare) > 0 _
        Then
            Exit Sub
        End If
    Next x
End Sub

Private Sub txtSearch_KeyPress(ByVal KeyAscii As msforms.ReturnInteger)
    If KeyAscii = 13 Then
        txtSearch.Text = lstUsers.Text
    End If
End Sub

在您键入时,txtSearch_Change事件会在每次击键时触发,并循环显示列表框值,直到找到第一个匹配项并选择它。我们还检查K​​eyPress事件以查看用户是否按Enter(ASCII 13)以自动完成搜索。我是不区分大小写的(我可以解决所有问题),但您可以轻松地将其修改为区分大小写(甚至可以添加一个复选框,以便用户可以选择区分大小写!)