Excel VBA自动筛选arrays
我正在使用Microsoft Excel在VBA中使用AutoFilters。 我有一个问题,它如何处理数组进行过滤; 我已经淡化了我的原始上下文到一个简化的版本(最初希望能够理解这个问题):
在范围A1:A5的工作表中,假设我们分别有Fruit
, Apple
, Banana
, Orange
和Pear
。 已应用AutoFilter,使Fruit
是列标题。
运行下面的代码将返回预期的结果( Apple
, Banana
和Orange
但不是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