如何使用VBA从下拉列表中过滤列表

时间:2018-03-22 08:09:01

标签: excel vba excel-vba filtering dropdown

对不起我需要一些关于使用VBA过滤下拉列表的帮助我已经有了一个脚本来创建一个使用VBA的下拉列表

Dim LRow As Long 
Dim ws As Worksheet
Dim Rng As Range

Set ws = ThisWorkbook.Worksheets("Input_PH")

LRow = Worksheets("PH").Range("A" & Worksheets("PH").Rows.Count).End(xlUp).Row
Set Rng = ws.Range("D5")
With Rng.Validation
    .Delete
   .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="='PH'!$A$2:$A$" & LRow

现在从下拉列表中我如何使用我在其他列中输入的值来过滤它,

例如E5,我有一个下拉列表中的列表是"考试","退出","离开","去了"当我进入"前"在E5列中,D5中的下拉列表被过滤并变为"考试","退出"

我希望有人可以帮助我。 感谢

1 个答案:

答案 0 :(得分:0)

据我所知......

  • 您在Excel工作表中有一个列表(" PH")。
  • 该列表在工作表(" Input_PH")中的单元格D5上填充验证列表,并将其配置为下拉列表。
  • 您希望验证列表按工作表上的单元格E5中的值进行过滤(" Input_PH")。

解决方案

  1. 创建一个返回已过滤列表的函数。
  2. 在更新E5时,将过滤后的列表用于单元格D5上的验证标准。
  3. 为了让生活更轻松,请在工作表上命名未过滤的列表(" PH")。称之为" drop_list" (没有引号)。这样可以避免在上面的代码段中使用LRow。

    过滤功能

    将此功能放入您的VBA模块

    Function filter_list(the_filter, the_list)
        ' compile a list of filtered values
        Dim filtered_values
        For Each list_item In the_list
            If InStr(LCase(list_item), LCase(the_filter)) > 0 Or the_filter = "" Then
                filtered_values = filtered_values & list_item & ","
            End If
        Next
         ' default value if no match
        filter_list = ""
        ' remove trailing ,
        If Len(filtered_values) > 1 Then filter_list = Left(filtered_values, Len(filtered_values) - 1)
    End Function
    

    验证更新方法

    在VBA编辑器中,将此子文件放在工作表中(" Input_PH")。它需要到这里来利用Worksheet_Change事件触发器。这不是您的代码段。

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim Rng As Range
        Dim the_filter As Range, the_list As Range
        Set the_filter = Me.Range("E5")
    
        If Target.Address = the_filter.Address Then
            Set Rng = Me.Range("D5")
            Set the_list = ThisWorkbook.Names("drop_list").RefersToRange
            filtered_list = filter_list(the_filter.Cells(1).Value, the_list.Value)
            With Rng.Validation
                .Delete
                If filtered_list <> "" Then .Add Type:=xlValidateList, Formula1:=filtered_list
            End With
        End If
    End Sub
    

    在工作表上输入值(&#34; Input_PH&#34;)时,将触发Worksheet_Change。如果更改在E5中,则更新D5上的验证过滤器。如果E5为空,则验证列表将填入完整列表。无效值会删除验证。