VBA中的自动过滤标准值

时间:2013-10-31 12:09:19

标签: excel vba autofilter

我有一个具有激活的自动过滤模式的表,并且已知只有Criteria1类型的过滤是适用的(即隐含地指示感兴趣的项目)。我的目标是为VBA中的每列提取标准列表。我使用IsArray(.Filters(i).Criteria1)来确定是否为特定列选择了多个项目,并且当选择1个或多于2个项目时一切正常。但是,当我选择2个项目时,.Filters(i).Criteria1由于某种原因未被识别为数组。 .Filters(i).Criteria1仅返回列表中较高的项目。

任何人都可以解释一下:为什么会这样?处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,但如果有人最终在这里感到困惑,那就很困惑。

使用过滤器对象(可能是worksheet.autofilter.filters集合的一部分)

以下是1:

对列进行过滤:

filters(i).criteria1是一个字符串

列上的2个过滤器:

filters(i).criteria1是一个字符串

filters(i).criteria2是一个字符串

列上的3个或更多过滤器:

filters(i).criteria1是一个字符串数组(这是一个变体)

filters(i).criteria2不存在

这在MSDN中并不是那么清楚,但它会发生什么。我唯一的猜测是,在过去的excel版本中,无法添加超过1个过滤条件,因此保留旧的criteria1和criteria2类型以实现向后兼容性。尽管如此,这是一个愚蠢的系统。

这意味着获取过滤器属性的唯一方法(据我所见)如下:

For Each f In ActiveSheet.AutoFilter.Filters
    If f.On Then
        If IsArray(f.Criteria1) Then
            cA = f.Criteria1
        Else
            c1 = f.Criteria1
            On Error Resume Next
                c2 = f.Criteria2
            On Error GoTo 0
        End If
    End If
Next

因为IsEmpty(f.Criteria1)IsNull(f.Criteria1)的Criteria2错误,所以我可以看到检查它是否存在的唯一方法是使用丑陋的on error resume next