Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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/0/vba/17.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
Excel从列表中搜索并选择-非下拉列表_Excel_Vba - Fatal编程技术网

Excel从列表中搜索并选择-非下拉列表

Excel从列表中搜索并选择-非下拉列表,excel,vba,Excel,Vba,我在网上看了很多例子。我找到的所有东西都在组合框下拉列表中。我的老板想输入excel,例如在A1123456中,然后它必须自动过滤列表中的数据,所有列表都以123456开头。然后,他选择他想要的选项,然后转到单元格A2 我试过的所有例子都是一个组合框,这不是他需要的。有人能给我指一下正确的方向吗?我将非常感谢您的帮助。在回答问题的基础上,我想出了一些可行的办法。我最近也有类似的要求;我认为这是一个很好的感觉,而不是通常的用户界面过滤器 我的设置如下所示: Private Sub Workshee

我在网上看了很多例子。我找到的所有东西都在组合框下拉列表中。我的老板想输入excel,例如在A1123456中,然后它必须自动过滤列表中的数据,所有列表都以123456开头。然后,他选择他想要的选项,然后转到单元格A2


我试过的所有例子都是一个组合框,这不是他需要的。有人能给我指一下正确的方向吗?我将非常感谢您的帮助。

在回答问题的基础上,我想出了一些可行的办法。我最近也有类似的要求;我认为这是一个很好的感觉,而不是通常的用户界面过滤器

我的设置如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim filterField
    filterField = 0

    If Target.Address = "$B$2" Then
        filterField = 1
    ElseIf Target.Address = "$C$2" Then
        filterField = 2
    ElseIf Target.Address = "$D$2" Then
        filterField = 3
    ElseIf Target.Address = "$E$2" Then
        filterField = 4
    End If

    If filterField <> 0 Then
        Call UpdateFilter(filterField, Target.Value)
    End If
End Sub

正如@PeterT所提到的,您需要对特定的工作表使用工作表\u更改事件,如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim filterField
    filterField = 0

    If Target.Address = "$B$2" Then
        filterField = 1
    ElseIf Target.Address = "$C$2" Then
        filterField = 2
    ElseIf Target.Address = "$D$2" Then
        filterField = 3
    ElseIf Target.Address = "$E$2" Then
        filterField = 4
    End If

    If filterField <> 0 Then
        Call UpdateFilter(filterField, Target.Value)
    End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
暗滤场
filterField=0
如果Target.Address=“$B$2”,则
filterField=1
ElseIf Target.Address=“$C$2”则
过滤器字段=2
ElseIf Target.Address=“$D$2”则
过滤器字段=3
ElseIf Target.Address=“$E$2”则
过滤器字段=4
如果结束
如果过滤器字段为0,则
调用UpdateFilter(filterField,Target.Value)
如果结束
端接头
代码中有很多清理和简化的地方,这个版本对于这个特定的例子来说既快又脏——应该不难概括,但是如果你需要帮助,请留下评论

您需要更多的VBA来更新过滤器:

Public Sub UpdateFilter(filterField, strValue)

    If strValue = "" Then
        Range("B4").AutoFilter field:=filterField, Criteria1:="<>"
    Else
        strValue = strValue & "*"
        Range("B4").AutoFilter field:=filterField, Criteria1:=strValue
    End If
End Sub
公共子更新过滤器(过滤器字段,标准值)
如果strValue=“”,则
范围(“B4”)。自动筛选字段:=筛选字段,标准1:“”
其他的
strValue=strValue&“*”
范围(“B4”)。自动筛选字段:=筛选字段,标准1:=标准值
如果结束
端接头
最终结果如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim filterField
    filterField = 0

    If Target.Address = "$B$2" Then
        filterField = 1
    ElseIf Target.Address = "$C$2" Then
        filterField = 2
    ElseIf Target.Address = "$D$2" Then
        filterField = 3
    ElseIf Target.Address = "$E$2" Then
        filterField = 4
    End If

    If filterField <> 0 Then
        Call UpdateFilter(filterField, Target.Value)
    End If
End Sub

在字符串末尾添加“*”允许部分匹配(“以…”开头):


基于对的答案,我想出了一些应该有效的方法。我最近也有类似的要求;我认为这是一个很好的感觉,而不是通常的用户界面过滤器

我的设置如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim filterField
    filterField = 0

    If Target.Address = "$B$2" Then
        filterField = 1
    ElseIf Target.Address = "$C$2" Then
        filterField = 2
    ElseIf Target.Address = "$D$2" Then
        filterField = 3
    ElseIf Target.Address = "$E$2" Then
        filterField = 4
    End If

    If filterField <> 0 Then
        Call UpdateFilter(filterField, Target.Value)
    End If
End Sub

正如@PeterT所提到的,您需要对特定的工作表使用工作表\u更改事件,如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim filterField
    filterField = 0

    If Target.Address = "$B$2" Then
        filterField = 1
    ElseIf Target.Address = "$C$2" Then
        filterField = 2
    ElseIf Target.Address = "$D$2" Then
        filterField = 3
    ElseIf Target.Address = "$E$2" Then
        filterField = 4
    End If

    If filterField <> 0 Then
        Call UpdateFilter(filterField, Target.Value)
    End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
暗滤场
filterField=0
如果Target.Address=“$B$2”,则
filterField=1
ElseIf Target.Address=“$C$2”则
过滤器字段=2
ElseIf Target.Address=“$D$2”则
过滤器字段=3
ElseIf Target.Address=“$E$2”则
过滤器字段=4
如果结束
如果过滤器字段为0,则
调用UpdateFilter(filterField,Target.Value)
如果结束
端接头
代码中有很多清理和简化的地方,这个版本对于这个特定的例子来说既快又脏——应该不难概括,但是如果你需要帮助,请留下评论

您需要更多的VBA来更新过滤器:

Public Sub UpdateFilter(filterField, strValue)

    If strValue = "" Then
        Range("B4").AutoFilter field:=filterField, Criteria1:="<>"
    Else
        strValue = strValue & "*"
        Range("B4").AutoFilter field:=filterField, Criteria1:=strValue
    End If
End Sub
公共子更新过滤器(过滤器字段,标准值)
如果strValue=“”,则
范围(“B4”)。自动筛选字段:=筛选字段,标准1:“”
其他的
strValue=strValue&“*”
范围(“B4”)。自动筛选字段:=筛选字段,标准1:=标准值
如果结束
端接头
最终结果如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim filterField
    filterField = 0

    If Target.Address = "$B$2" Then
        filterField = 1
    ElseIf Target.Address = "$C$2" Then
        filterField = 2
    ElseIf Target.Address = "$D$2" Then
        filterField = 3
    ElseIf Target.Address = "$E$2" Then
        filterField = 4
    End If

    If filterField <> 0 Then
        Call UpdateFilter(filterField, Target.Value)
    End If
End Sub

在字符串末尾添加“*”允许部分匹配(“以…”开头):


用户在A1中键入值时,您没有说明要过滤的列表或范围。但是,请注意编写代码以捕获该工作表的
工作表\u Change
事件。你可以专注于A1中用户的输入,然后继续对你需要的任何列表或范围应用过滤器;这是一个巧妙的解决办法。我之前已经仔细研究过了,这正是您的用例;我找不到任何不使用VBA的内容。当用户在A1中键入值时,您没有说明要筛选的列表或范围。但是,请注意编写代码以捕获该工作表的
工作表\u Change
事件。你可以专注于A1中用户的输入,然后继续对你需要的任何列表或范围应用过滤器;这是一个巧妙的解决办法。我之前已经仔细研究过了,这正是您的用例;我找不到任何不使用VBA的东西。