2013-08-02 3 views
1

У меня 6 UserForms, которые всплывают и попросит вас выбрать переменные, которые вы хотите отсортировать:UserForms для установки нескольких критериев фильтрации

  1. ClientFilter
  2. CostCenterFilter
  3. UtilityFilter
  4. TypeOfWorkfilter
  5. AnalystFilter
  6. ProjMgrFilter

Внутри каждого из них используются выражения if для каждой переменной.

Sub UpdateCF() 
    Integer_CF = -1 

    If AU_CF.Value = True Then 
     Add_CF String_CF, "AU" 
     Range("$B$6:$AU$68").AutoFilter _ 
       Field:=2, Criteria1:=String_CF, _ 
       Operator:=xlFilterValues 
    End If 

    If AULaw_CF.Value = True Then 
     Add_CF String_CF, "AULAW" 
     Range("$B$6:$AU$68").AutoFilter _ 
       Field:=2, Criteria1:=String_CF, _ 
       Operator:=xlFilterValues 
    End If 
    ... 

End Sub 

Sub Add_CF(String_CF() As String, NewValue As String) 
    Integer_CF = Integer_CF + 1 
    ReDim Preserve String_CF(Integer_CF) 
    String_CF(Integer_CF) = NewValue 
End Sub 

Это прекрасно работает, за исключением того, что я хочу иметь возможность сортировать по нескольким полям. Например, я хотел бы использовать «Фильтр клиентов», а затем выбрать переменную, а затем использовать «Пользовательскую форму« Центр затрат », чтобы иметь возможность одновременного включения обеих ролей.

ответ

1

Я не уверен, почему вы думаете, что у вас есть проблема - вы можете использовать тот же подход, что и выше, но добавьте фильтр в другое поле. Это будет фильтровать на обоих.

Например (очевидно, нужно будет приспособиться к вашей ситуации):

Sub blah() 

    Dim currentFilters_FirstField 
    Dim currentFilters_SecondField 
    Dim field1_Option1, field1_Option2, field2_Option1, field2_Option2 'just an example 
    Dim rng As Range 

    field1_Option1 = True 
    field1_Option2 = True 
    field2_Option1 = True 
    field2_Option2 = False 

    'prepare your filters from the menu etc 
    If field1_Option1 Then appendFilterValue currentFilters_FirstField, "AU" 
    If field1_Option2 Then appendFilterValue currentFilters_FirstField, "AULAW" 
    If field2_Option1 Then appendFilterValue currentFilters_SecondField, "Whatever1" 
    If field2_Option2 Then appendFilterValue currentFilters_SecondField, "Whatever2" 

    Set rng = Range("A1:D100") ' range for the filtering etc 
    rng.AutoFilter 1, currentFilters_FirstField, xlFilterValues 
    rng.AutoFilter 2, currentFilters_SecondField, xlFilterValues 'note the different field this is applying to 

End Sub 

Sub appendFilterValue(ByRef currentFilters, newFilter) 

    If IsArray(currentFilters) Then 
     ReDim Preserve currentFilters(0 To UBound(currentFilters) + 1) 
    Else 
     ReDim currentFilters(0 To 0) 
    End If 

    currentFilters(UBound(currentFilters)) = newFilter 

End Sub 
+0

бы я поставил это в модуле и вызовите его с форума User или поместить его в каждом UserForm –

+0

@MichaelDowney Это зависит от того, вашей объектной модели. Некоторым людям нравится вводить логику бизнеса в свои пользовательские формы. Я предпочитаю использовать пользовательские формы для разработки «аргументов», например. для вашего случая - свойство, указывающее, должен ли фильтр AULAW быть включен, устанавливается в true, а процедура «main», которая вызвала форму пользователя, извлекает требуемый аргумент из этих свойств и вызывает соответствующую процедуру, которая активирует фильтры. Таким образом, вы централизуете «бизнес-логику», и каждая специальная форма фильтра фильтров работает одинаково. –

+0

@MichaelDowney также вы можете использовать тот же принцип, что и вы уже работаете, -> то же самое можно использовать для установки фильтра на основе нескольких полей. Мой код выше - просто демо. Вы уже правильно создаете массивы значений фильтра и т. Д. :) –