【问题标题】:Creating a multiple field search function in excel VBA在excel VBA中创建多字段搜索功能
【发布时间】:2017-03-31 00:33:16
【问题描述】:

我需要在 VBA 中构建一个链接搜索功能,该功能在您将数据输入给定搜索字段后也会自动更新。我已经能够使用以下代码部分成功地做到这一点:

自动过滤搜索 - 在标准模块中

代码:

Sub FilterTo1Criteria()
With Sheet3
    If Range("A3") <> vbNullString Then
        .AutoFilterMode = False
        .Range("A6:J1015").AutoFilter
        .Range("A6:J1015").AutoFilter Field:=1, Criteria1:=Range("A3")
    Else
        Selection.AutoFilter
    End If
End With
End Sub

工作表更改/自动更新 - 这是在工作表模块中

代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$3" Then
        Application.EnableEvents = False
        FilterTo1Criteria
        Application.EnableEvents = True
    End If
End Sub

但是,在工作表更改页面中,我需要单元格 A3:J3 作为条件,但如果仅填写 A3 和 D3,或者仅填写 A3(D3为空白),或者仅填写 D3(A3 为空白),但我在尝试复合代码以获得此效果时遇到问题。我还要复杂多少?是否有人知道我可以查看一些示例以从中收集一些信息?很难找到...

带有数据透视表的切片器是一种可行的方法,但我认为下游的一些人正在使用 Excel 2003,而且我认为切片器的工作原理并没有那么远。

提前致谢!

【问题讨论】:

    标签: vba excel filter autofilter


    【解决方案1】:

    如果 A3 或 D3 不为空,则要使函数正常工作,您可以连接两个单元格并将其与 vbNullString 进行比较。

    对于多个过滤器,您可以使用循环来设置它们。

    例如:

    Sub FilterTo1Criteria()
        Dim i As Long
        With Sheet3
        If Range("A3") & Range("D3") <> vbNullString Then
                .AutoFilterMode = False
                .Range("A6:J1015").AutoFilter
                For i = 1 To 10
                    .Range("A6:J1015").AutoFilter Field:=i, Criteria1:=Cells(3, i)
                Next i
            Else
                Selection.AutoFilter
            End If
        End With
    End Sub
    

    编辑:

    您似乎希望在填充标准单元格时设置过滤器,而不是一次全部设置。试试这个:

    Sub FilterTo1Criteria()
        Dim i As Long
        With Sheet3
            .AutoFilterMode = False
            .Range("A6:J1015").AutoFilter
            For i = 1 To 10
                If .Cells(3, i) <> vbNullString Then
                    .Range("A6:J1015").AutoFilter Field:=i, Criteria1:=.Cells(3, i)
                End If
            Next i
        End With
    End Sub
    

    对于新的工作表更改子:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("$A$3:$J$3")) Is Nothing Then
            Application.EnableEvents = False
            FilterTo1Criteria
            Application.EnableEvents = True
        End If
    End Sub
    

    这将在您添加或删除条件时添加或删除过滤器(第 3 行)。

    【讨论】:

    • 谢谢!当我尝试这样做时,它说我收到“运行时错误'424':需要对象”并且在调试模式下它突出显示“.autofiltermode = False”行......
    • 这与您的原始代码并没有改变......昵称Sheet3是否有任何改变?如果您改为按名称引用工作表怎么办...
    • 啊,是的。我使用了一个稍微修改过的副本,只有一张纸来试验新代码。那清理了...但是没有,当我在 a3 和 d3 中有数据并运行宏时,屏幕闪烁,显示了一些数据,但随后什么也没有返回...
    • 数据中是否肯定存在与第 3 行完全匹配的行?因为这是过滤器现在检查的内容,所以将隐藏其他所有内容。 (这就是您所说的单元格 A3:J3 是标准的意思吗?)
    • 啊,好吧,我可能没有像我应该做的那样清楚。理想情况下,A3:J3 中的每个单元格都是某种形式的搜索条件。为了返回结果,我不需要全部填写...例如,如果只填写 A 单元格,即“产品类型”,则只会返回该确切类型。然后,如果你去 G3 并输入哪个城市,它将返回相应城市的产品类型,每个单元格中的搜索条件越来越多。现在,是否需要填写每个单元格才能返回结果?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多