Excel VBA自动筛选arrays

我正在使用Microsoft Excel在VBA中使用AutoFilters。 我有一个问题,它如何处理数组进行过滤; 我已经淡化了我的原始上下文到一个简化的版本(最初希望能够理解这个问题):

在范围A1:A5的工作表中,假设我们分别有FruitAppleBananaOrangePear 。 已应用AutoFilter,使Fruit是列标题。

运行下面的代码将返回预期的结果( AppleBananaOrange但不是Pear ):

 Range("A1").Select ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _ Criteria1:=Array("=*an*", "=*app*"), Operator:=xlFilterValues 

在我正在处理的项目中,筛选条件作为stringvariables传递,如上所述。 问题是每一个标准都不是每一个都适用,所以有些标准不应该有效果。

例如:

 Dim A As String, B As String, C As String A = "=*an*" B = Empty C = "=*ap*" Range("A1").Select ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _ Criteria1:=Array(A, B, C), Operator:=xlFilterValues 

B引入混合中,过滤不返回任何logging(不pipe它是否为null,设置为Empty ,或者使用通配符=* )。 但是,在实际标准数组中使用Empty (硬编码)replaceB将返回预期的结果。

我过去使用过类似的代码(并且已经工作了),尽pipe有一个AutoFilter是ListObject的一部分。 在这一点上,我能想到的唯一的事情是将filter连接成带有分隔符的string,并将其分成一个数组variables(因此,它的大小是精确的,因为集合中的未设置项目会以相同的方式一个标准variables)。 但这似乎不直观和繁琐。

我在这里错过了很明显的东西吗

我不能想办法做到这一点,不涉及testing的空参数,这里是一种方法可能会为你工作,也可以防止重复的expression式。

 Sub Main() Dim a As String Dim B As String Dim C As String Dim filterCriteria as Variant a = "=*an*" B = Empty C = "=*ap*" filterCriteria = CombineArrays(Array(a, B, C)) If Not uBound(filterCriteria) = -1 Then Range("A1").Select ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _ Criteria1:=filterCriteria, Operator:=xlFilterValues End If End Sub Function CombineArrays(arr As Variant) As Variant Dim a As Variant Dim filterDic As Object 'Scripting.Dictionary Set filterDic = CreateObject("Scripting.Dictionary") For Each a In arr If Not filterDic.Exists(a) And Not a = vbNullString Then filterDic.Add a, a End If Next CombineArrays = filterDic.Keys Set filterDic = Nothing End Function