【问题标题】:VBA: Return more than 2 filter criteriasVBA:返回超过 2 个过滤条件
【发布时间】:2014-09-05 11:15:14
【问题描述】:

我在一堆列上有一个标准过滤器,我想阅读过滤器标准。在选择超过 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 个标准。 我在不同的论坛找到了这行代码,但它被用于其他原因,我真的不知道如何为我使用这段代码:

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

这样你可以设置我认为的标准,但我想得到它。 有什么想法可以使用此代码吗?或者我的问题的另一个建议?

提前致谢!


编辑:

好吧,我已经为此工作了很多小时,但仍然没有解决方案。实际上不可能在数组中获取 Criteria1 中的数组。始终相同的错误“无法分配给数组”。虽然我之前将相同的数组分配给了 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

【问题讨论】:

    标签: excel vba filter autofilter


    【解决方案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 只是我的活动工作表

    我没有意识到我应该使数组变体,而不是将其初始化为简单的字符串数组。

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

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

    【讨论】:

      【解决方案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。

      【讨论】:

      • 感谢您的回答!但是我之前有这样一种方法,它有一个问题,我将通过示例来解释它: Col1 包含 Test1、Test2 和 Test3; Col2 包含 1,2,1。现在我用 Test1 和 Test2 过滤 Col1,用 1 过滤 Col2。此时该方法只返回 Test1 和 1,但它应该返回 Test1、Test2 和 1。我不明白的是,如果我将鼠标指向过滤器 -下拉按钮,它正是我想要得到的!但我不知道从哪里得到它......而且由于我在一个多星期的研究中没有找到答案,我可能认为没有答案。
      • @sk1ll 实际上,该例程也可以获取其他列上的过滤器。但是您需要添加检查是否过滤了某些内容。
      • 我知道,但该方法在所有过滤器都设置好后运行。并且仅在应用所有过滤器后查看值。在我上面所说的情况下,可能是有一个过滤器集,但没有实际值,因为另一列中的另一个过滤器使该行不可见。这可以理解吗?还是我只是想念一些东西而不理解你?
      • @sk1ll 是的,我明白了。同样,您需要在应用该功能之前使用过滤器获取范围。请参阅我的附加子以获取具有活动过滤器的范围。
      • 我似乎真的不明白。函数 GetFilters 正在寻找独特的项目,因此出现的每个单元格值都存储在其中,这就是 Filtercriteria。但是,如果某个单元格由于另一个过滤列而不再可见,则它不会出现在条件列表中,但应该出现。我想我们彼此交谈,或者我只是有点头晕:p
      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2021-12-14
      相关资源
      最近更新 更多