VBA:返回2个以上的过滤标准

时间:2014-07-15 09:56:47

标签: excel vba filter autofilter

我在一堆列上有一个标准过滤器,我想阅读过滤器标准。在选择了2个以上的标准之前,这不是一个真正的问题。我有一行不同的字符串,我希望能够得到用户选择的标准。目前我正在处理这段代码:

Set ws = Worksheets(actSheet)
For Each flt In ws.AutoFilter.Filters
    If flt.On = True Then
        criterias = criterias & flt.Criteria1 & ", "
        criterias = criterias & flt.Criteria2 & ", "
    End If
Next flt

这只能让我有机会获得最多2个Criteria。 我在不同的论坛中找到了这行代码,但由于其他原因使用它,我真的不知道如何为我使用这段代码:

ActiveSheet.AutoFilter Field:=1, Criteria1:=Array(param1, param2, param3,...) _
                       Operator:=xlFilterValues

这样你就可以设置标准,但我想获取它。 我有什么想法可以使用这段代码?还是我的问题的另一个建议?

提前致谢!


编辑:

我已经花了很多时间在这上面,但仍然没有解决方案。实际上不可能在Array中的Criteria1中获取Array。始终相同的错误"无法分配给数组"。虽然我在...之前将相同的数组分配给Filter Criteria1 10行代码。

这样可行:

Dim arr(3) As String
arr(2) = "test1"
arr(1) = "test2"
arr(3) = "test3"

ActiveSheet.Range("A1:C1").AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues

但这并不是:

arr = ws.AutoFilter.Filters.Criteria1

2 个答案:

答案 0 :(得分:2)

Edit2:这会获取过滤器及其标题

Sub GetFilteredItems()
    Dim fl As Filter
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim i As Long: i = 0
    Dim myfilters As String

    For Each fl In ws.AutoFilter.Filters
        If fl.On Then
            If Len(myfilters) = 0 Then
                myfilters = ws.AutoFilter.Range.Offset(0, i).Resize(1, 1).Value
            Else
                myfilters = myfilters & "; " & _
                    ws.AutoFilter.Range.Offset(0, i).Resize(1, 1).Value
            End If
            If fl.Count > 2 Then
                myfilters = myfilters & ": " & Replace(Join(fl.Criteria1), "=", "")
            Else
                myfilters = myfilters & ": " & Replace(fl.Criteria1, "=", "")
                On Error Resume Next
                myfilters = myfilters & " " & Replace(fl.Criteria2, "=", "")
                On Error GoTo 0
            End If
        End If
        i = i + 1
    Next
    Debug.Print myfilters
End Sub

我删除其他代码以避免混淆读者 这很像OP的方法,但有点直接。 HTH。

答案 1 :(得分:1)

最后我找到了答案!

问题不是太大,只是很难得到答案,因为你几乎没有在互联网上找到任何东西。

Dim criterias As String
Dim arr As Variant

For Each flt In ws.AutoFilter.Filters
If flt.On = True Then
    'write the column head in the string
    criterias = criterias & "=" & _ 
    ws.AutoFilter.Range.Offset(0, i - 1).Resize(1, 1).Value & ": "
    If flt.Count > 2 Then
        arr = flt.Criteria1                   '<----- my problem
        For i = LBound(arr) To UBound(arr)    '<-----
            criterias = criterias & arr(i)    '<-----
        Next                                  '<-----
    Else
        criterias = criterias & flt.Criteria1
        On Error Resume Next
        criterias = criterias & flt.Criteria2 & ", "
    End If

End If
i = i + 1
Next flt

ws只是我的活动工作表

我没有意识到我应该创建Variant数组,而不是将它初始化为一个简单的String数组。

之后,标准字符串看起来像“Criteria1:= test1 = test2 = test3”,所以只需将“=”替换为“,”或类似的东西,你就完成了!

来自德国办事处的Axel Richter在这个问题上是一个很大的帮助;)(对于德国读者:http://www.office-loesung.de/p/viewtopic.php?f=166&t=666472&p=2773974#p2773974