我有一个具有激活的自动过滤模式的表,并且已知只有Criteria1类型的过滤是适用的(即隐含地指示感兴趣的项目)。我的目标是为VBA中的每列提取标准列表。我使用IsArray(.Filters(i).Criteria1)
来确定是否为特定列选择了多个项目,并且当选择1个或多于2个项目时一切正常。但是,当我选择2个项目时,.Filters(i).Criteria1
由于某种原因未被识别为数组。 .Filters(i).Criteria1
仅返回列表中较高的项目。
任何人都可以解释一下:为什么会这样?处理这个问题的最佳方法是什么?
答案 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