VBA: цикл по критериям в фильтре Excel? - PullRequest
2 голосов
/ 27 марта 2012

Я пытался понять это все утро.Есть ли способ перебрать критерии в фильтре столбцов в Excel, одновременно заполняя массив именами критериев?Кажется, что объекты фильтра имеют только критерии1 и критерии2.Извините, если какая-то моя терминология неясна, я довольно новичок в Excel.

(используется Excel 2007)

Ответы [ 2 ]

1 голос
/ 29 июня 2012

У меня была та же проблема, когда я хотел иметь определяемую пользователем строку для фильтрации, в которой люди могли бы указать столбец и значение фильтра для нескольких столбцов одновременно.

В этом примере пользователи строкиможно определить выглядит так:

"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

Приведенная выше функция создаст многомерный массив из строки, значения которой могут использоваться с автофильтром Excels изстрока.Код использования:

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

Когда значения фильтра равны «Не равно» или «содержит», вы можете использовать встроенный в Excel способ, например,

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

Плохая часть: несколько критериев в 1 столбце недоступны, как в предыдущем примере.

1 голос
/ 27 марта 2012

Похоже, что если вы выбрали 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 (неожиданный сюрприз), так как он напечатан свободно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...