-1

我有一个激活自动过滤模式的表,并且已知只有 Criteria1 类型的过滤适用(即隐式指示感兴趣的项目)。我的目标是为 VBA 中的每一列提取一个标准列表。I used IsArray(.Filters(i).Criteria1)to determine if there is more than 1 item selected for a particular column and everything works fine when either 1 or more than 2 items are selected. 但是,当我选择 2 个项目时,.Filters(i).Criteria1由于某种原因不被识别为数组。.Filters(i).Criteria1仅返回列表中较高的项目。

谁能解释我:为什么会这样,处理这个问题的最佳方法是什么?

4

1 回答 1

0

这是一个古老的问题,但万一有人在这里感到困惑,困惑。

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

这是1发生:

列上的 1 个过滤器:

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

一列上有 2 个过滤器:

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

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

一列上有 3 个或更多过滤器:

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

filters(i).criteria2不存在

这在 MSDN 中并不清楚,但这就是发生的事情。我唯一的猜测是,在过去的 excel 版本中,不可能添加超过 1 个过滤条件,因此保留了旧的条件 1 和条件 2 类型以实现向后兼容性。尽管如此,这是一个愚蠢的系统。

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

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

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

于 2017-10-24T17:52:30.743 回答