2012-03-27 53 views
2

我一直想弄明白这一点。有没有办法在Excel中的列过滤器中循环条件,同时使用条件的名称填充数组?看来过滤器对象只有一个criteria1和criteria2。对不起,如果我的任何术语不清楚,我对Excel很新。VBA:通过Excel筛选器中的标准循环?

(这是使用Excel 2007)

+0

哪个版本的Excel? – 2012-03-27 15:51:29

+0

这是Excel 2007,对不起。 – superadamwo 2012-03-27 15:53:17

+0

嗯我只得到2010年和2003年。2007年有多指标复选框方式指定标准? – 2012-03-27 15:54:45

回答

1

似乎如果你有然后选择1个或2个标准这些将被存储在.Criteria1.Criteria2

不过,如果你有2个以上则.Criteria1成为选择的过滤器的阵列 - 你可以再通过使用迭代...

Dim iFilt As Integer  'This should be set equal to the column 
          'index you are interested in 

Dim iFiltCrit as Integer 

For iFiltCrit = 1 To UBound(Sheet1.AutoFilter.Filters(iFilt).Criteria1) 
    Debug.Print Sheet1.AutoFilter.Filters(iFilt).Criteria1(iFiltCrit) 
Next 

注意,这只适用于拥有超过一列2标准 - 你如何确定是否是这种情况取决于你 - 这是一个相当笨重的Excel API(惊喜),因为它是松散的类型。

+0

到目前为止,我还没有能够得到这个工作。这是我的代码: '昏暗iFiltCrit作为整数 Debug.Print(UBound函数(ActiveSheet.AutoFilter.Filters(projCol).Criteria1)) 对于iFiltCrit = 1到UBound函数(ActiveSheet.AutoFilter.Filters(projCol).Criteria1) Debug.Print(ActiveSheet.AutoFilter.Filters(projCol))。Criteria1(iFiltCrit)) Next' Ubound的值为4,但它给出了一个错误,指出“Property let procedure not defined and property get procedure does not return an object” – superadamwo 2012-03-27 17:04:46

+0

我想你可能无法使用Criteria1数组上的索引,因为尽管该代码不起作用,但似乎使用For Each循环。 – superadamwo 2012-03-27 18:09:04

+0

嗯是的,我也设法得到这个错误。它昨天晚上在工作!典型的Excel VBA怪异。害怕我现在放弃。祝你好运! :) – 2012-03-28 07:55:04

1

我有同样的问题,我想有一个用户定义的字符串进行过滤,其中人们可以一次给多列的列和filtervalue。

在这个例子中,字符串用户可以自定义的样子:

“A,FOO; B,酒吧; AD,面目全非”
或者 “ColumnLetterOrIndex逗号FilterValue分号” 重复。 等等的任何数量的列和值。

代码:

Public Function createFilter(filterstring as string) as Variant 
Dim tempFilter As Variant 
Dim realFilter As Variant 

tempfilter = Split(filterstring, ";") 
For i = LBound(tempfilter) To UBound(tempfilter) 
    ReDim Preserve realFilter(i) 
    realFilter(i) = Split(tempfilter(i), ",", 2) 
'The 2 is needed if the filtervalue contains a comma on itself. Otherwise, it can be omitted. 
Next i 
createFilter = realFilter 
End Function 

上述功能将创建从该值可与来自一个字符串优异自动筛选中使用的字符串的多维阵列。使用代码:

Dim userFilter as Variant 
userFilter = createFilter(userDefinedFilterString) 
For i = LBound(userFilter) To UBound(userFilter) 
    'Note that here you'll have to convert the Columnletter to something numeral, unless the users define their column like 1, 2, 3 instead of A, B, C. 
    thefiltercolumn = Measure.filter(i)(0) 
    .AutoFilter thefiltercolumn, Measure.filter(i)(1) 
Next i 

当filtervalues都等于“不等于”或“包含了”,你可以使用Excel内置的这样做的方式,例如

A,<>foo;B,*bar*;AD,>=5 

坏的部分:在第1列的多个条件,不提供象前面的例子英寸