【问题标题】:Can Advanced Filter criteria be in the VBA rather than a range?高级筛选条件可以在 VBA 中而不是在一个范围内吗?
【发布时间】:2016-01-17 02:07:38
【问题描述】:

在尝试通过 VBA 以正常的 AutoFilter 方式设置超过 2 个条件但徒劳无功后,我了解到必须通过高级过滤器来完成。

违规示例:

Worksheets(1).Range("A1").AutoFilter Field:=ColNum, Criteria1:="A*", Operator:=xlOr, Criteria2:="B*", Operator:=xlOr, Criteria3:="C*"

我希望将条件从 PowerShell 脚本传递给函数(而不是宏)。我的工作正常,符合 1 个标准的预期,但现在我想要 3 个。

我想我可以改为编写一个宏来插入新工作表,写入条件然后过滤该新范围,但我宁愿先检查首选方式。

【问题讨论】:

  • 恐怕只能是一个范围。
  • 创建通配符匹配的变体数组,然后将完整值数组与标准 AutoFilter method 一起使用。我已经使用字典对象完成了这项工作,以使用其唯一的索引属性。
  • 这不会成为自定义过滤器并由于 >2 而失败吗?
  • @Chris - 请参阅下面的通用解决方案。

标签: vba excel dictionary autofilter


【解决方案1】:

要过滤多个通配符,请创建通配符匹配的变体数组,然后将完整值数组与标准 AutoFilter 方法一起使用。您可以通过将字典对象与它的唯一索引属性一起使用来最小化数组。

考虑以下示例数据。

      

运行此代码。

Sub multiWildcards()
    Dim v As Long, vVALs As Variant, dVALs As Object
    Dim colNum As Long

    Set dVALs = CreateObject("Scripting.Dictionary")
    dVALs.comparemode = vbTextCompare
    colNum = 2 'column B

    With Worksheets(1)
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            vVALs = .Columns(colNum).Cells.Value2
            For v = LBound(vVALs, 1) To UBound(vVALs, 1)
                If Not dVALs.exists(vVALs(v, 1)) Then
                    Select Case UCase(Left(vVALs(v, 1), 1))
                        Case "A", "B", "C"
                            dVALs.Add Key:=vVALs(v, 1), Item:=vVALs(v, 1)
                        Case Else
                            'do nothing
                    End Select
                End If
            Next v

            If CBool(dVALs.Count) Then
                'populated the dictionary; now use the keys
                .AutoFilter Field:=colNum, Criteria1:=dVALs.keys, Operator:=xlFilterValues
            Else
                Debug.Print "Nothing to filter on; dictionary is empty"
            End If

            '.CurrentRegion is now filtered on A*, B*, C* in column B
            'do something with it
        End With
    End With

    dVALs.RemoveAll: Set dVALs = Nothing
End Sub

结果应该是:

      

这些结果可以与许多其他通配符方案重复。 Select Case statement 非常理想,因为它支持 Like 关键字来构建您的匹配集合。通过将值转储到常规变体数组开始,可以快速循环遍历大行数据。

【讨论】:

  • 有趣,会试一试。非常感谢。下一步是从 PowerShell 将值数组传递给 VBA!
  • 刚刚尝试运行它并在 .AutoFilter Field:=colNum, Criteria1:=dVALs.keys, Operator:=xlFilterValues 上获取类型不匹配
  • 这可能与您的 Excel 版本及其 SP 有关。试试Criteria1:=(dVALs.keys)。老实说,我没有编造图像。
  • 我不敢建议你这样做!我很可能犯了一些错误。我已经添加了括号,但得到了同样的错误。如果有帮助,我正在使用 Excel 2013
  • 顺便说一句,Debug.Print 向 VBE 的 立即 窗口报告。点击 Ctrl+G 以显示它(或者查看 ► 即时窗口)。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2023-02-02
相关资源
最近更新 更多