Excel VBA动态过滤器

时间:2019-01-27 19:08:32

标签: excel vba

我正在尝试根据不同的条件和不同的标准创建动态过滤器。假设用户正在提供一些数据,例如

Sal>100 and sal<1000 and not equal to 500

我能够动态创建具有所有条件和值的字符串并将其存储在变量中。

这里是示例:

Filter_con具有以下值

Criteria1:=">10", Operator:=xlAnd, Criteria2:="<100000000",Operator:=xlFilterValues

当我尝试执行代码时

Selection.AutoFilter Field:=235, Filter_con

我遇到了错误:

  

运行时错误:1004   范围类的自动筛选方法失败。

这是代码

t_lastrow = Cells(Rows.Count, 1).End(xlUp).Row
Range("A3:XFD" & t_lastrow).Select
If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or 
ActiveSheet.FilterMode Then
Selection.ShowAllData
End If
Filter_Con=">10","<100000000"
Filter_numric_data = Split(Replace(Filter_Con, Chr(34), ""), ",")
UBU = UBound(Filter_numric_data)
     Filter_Con = ""
        For i__ = 0 To UBU
           If i__ <> UBU Then
             MsgBox (Filter_numric_data(i__))
            Filter_Con = Filter_Con & " Criteria" & i__ + 1 & ":=" & 
            Filter_numric_data(i__) & ", Operator:=xlAnd,"
           Else
            Filter_Con = Filter_Con & " Criteria" & i__ + 1 & ":=" & 
            Filter_numric_data(i__)
        End If
        Next
       Range("A3:XFD" & t_lastrow).Select
       Selection.AutoFilter Field:=Filter_Field & "," & Filter_Con

1 个答案:

答案 0 :(得分:0)

创建一个要显示的所有值的字典。将字典项用作带有xlfiltervalues的条件。

Option Explicit

Sub sdfgh()
    Dim vals As Variant, i As Long, dict As Object

    Set dict = CreateObject("scripting.dictionary")

    With Worksheets("sheet1")

        If .AutoFilterMode Then .AutoFilterMode = False

        vals = .Range(.Cells(2, "IA"), .Cells(.Rows.Count, "IA").End(xlUp)).Value2

        For i = LBound(vals, 1) To UBound(vals, 1)

            Select Case True
                Case vals(i, 1) > 100 And vals(i, 1) < 1000 And vals(i, 1) <> 500
                    'xlFilterValues requires text
                    dict.Item(vals(i, 1)) = CStr(vals(i, 1))
                Case Else
                    'do nothing
            End Select

        Next i

        With .Cells(1, "A").CurrentRegion

            .AutoFilter field:=235, Criteria1:=dict.items, Operator:=xlFilterValues

        End With

    End With
End Sub