2013-05-17 16 views
5

Teraz robię kodowanie, aby ustawić filtr dla wykresu danych. W zasadzie nie wiem jak odpowiedzieć na karcie tu więc tylko próbować je wpisać):Ustawianie automatycznego filtrowania wielu symboli wieloznacznych

(zaczynając od lewej jest kolumna A) Nazwisko * BDevice * Ilość * Sprzedaż * Właściciel

Zasadniczo muszę odfiltrować 2 kolumny: - BDevice z dowolnym słowem zawierającym "M1454" lub "M1467" lub "M1879" (Oznacza to, że nadal pasują M1454A lub M1467TR) -Właściciel z PROD lub RYZYKIEM

Oto kod, który napisałem:

Sub AutoFilter() 

    ActiveWorkbook.ActiveSheet..Range(B:B).Select 

    Selection.Autofilter Field:=1 Criteria1:=Array(_ 
     "*M1454*", "*M1467*", "*M1879*"), Operator:=xlFilterValues 

    Selection.AutoFilter Field:=4 Criteria1:="=PROD" _ 
     , Operator:=xlOr, Criteria2:="=RISK" 

End Sub 

Po uruchomieniu kodu urządzenie zwraca błąd 1004, a część, która wydaje się być niewłaściwa, to część filtru 2 (nie jestem pewna co do użycia pola, więc nie mogę tego powiedzieć na pewno)

Edytuj; Santosh: Kiedy próbuję twojego kodu, maszyna dostaje błąd 9 indeksów poza zakresem. Błąd pochodził z instrukcji with. (Ponieważ tabela danych ma do kolumny jako tak po prostu zmienić na: AS)

+0

Czy możesz podać mi nazwę arkusza, na którym znajdują się twoje dane? – Santosh

+3

Autofiltr jest wbudowanym terminem VBA. Powoduje to błąd kompilacji na moim komputerze, gdy wykonuję kod z @Santosh w obiekcie arkusza. Zmiana nazwy podsystemu rozwiązuje ten problem. – Mike

Odpowiedz

0

Spróbuj poniżej kodu:

max 2 wieloznaczne wyrażenie Criteria1 działa. Patrz tej link

Sub AutoFilter() 

    With ThisWorkbook.Sheets("sheet1").Range("A:E") 
     .AutoFilter Field:=2, Criteria1:=Array("*M1454*", "*M1467*"), Operator:=xlFilterValues 
     .AutoFilter Field:=5, Criteria1:="=PROD", Operator:=xlOr, Criteria2:="=RISK" 
    End With 

End Sub 
6

Chociaż nie ma maksymalnie dwa bezpośrednich symboli wieloznacznych na polu w AutoFilter method, pasujący wzorzec może być wykorzystywany do utworzenia tablicy, który zastępuje symboli wieloznacznych z Operator: = xlFilterValues ​​ opcji. A Select Case statement pomaga w dopasowywaniu symboli wieloznacznych.

Drugie pole to prosty bezpośredni konkurs Criteria1 i Criteria2 z operatorem : = xlOr łączącym oba kryteria.

Sub multiWildcardFilter() 
    Dim a As Long, aARRs As Variant, dVALs As Object 

    Set dVALs = CreateObject("Scripting.Dictionary") 
    dVALs.CompareMode = vbTextCompare 

    With Worksheets("Sheet1") 
     If .AutoFilterMode Then .AutoFilterMode = False 
     With .Cells(1, 1).CurrentRegion 
      'build a dictionary so the keys can be used as the array filter 
      aARRs = .Columns(2).Cells.Value2 
      For a = LBound(aARRs, 1) + 1 To UBound(aARRs, 1) 
       Select Case True 
        Case aARRs(a, 1) Like "MK1454*" 
         dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1) 
        Case aARRs(a, 1) Like "MK1467*" 
         dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1) 
        Case aARRs(a, 1) Like "MK1879*" 
         dVALs.Add Key:=aARRs(a, 1), Item:=aARRs(a, 1) 
        Case Else 
         'no match. do nothing 
       End Select 
      Next a 

      'filter on column B if dictionary keys exist 
      If CBool(dVALs.Count) Then _ 
       .AutoFilter Field:=2, Criteria1:=dVALs.keys, _ 
             Operator:=xlFilterValues, VisibleDropDown:=False 
      'filter on column E 
      .AutoFilter Field:=5, Criteria1:="PROD", Operator:=xlOr, _ 
            Criteria2:="RISK", VisibleDropDown:=False 

      'data is filtered on MK1454*, MK1467* or MK1879* (column B) 
      'column E is either PROD or RISK 
      'Perform work on filtered data here 
     End With 
     If .AutoFilterMode Then .AutoFilterMode = False 
    End With 

    dVALs.RemoveAll: Set dVALs = Nothing 
End Sub 

Jeśli exclusions¹ mają być dodane do filtrowania, ich logika powinna być umieszczona na górze wybierz .. End Select w porządku, że nie są dodanego przez fałszywie dodatni pasujące do pozostałych kryteriów.

multi_Wildcard_Filter_Before
Przed zastosowaniem Autofiltru Sposób

multi_Wildcard_Filter_After
Po zastosowaniu w/Autofiltru wielu wieloznacznych


¹ Patrz Can Advanced Filter criteria be in the VBA rather than a range? i Can AutoFilter take both inclusive and non-inclusive wildcards from Dictionary keys? dłużej o dodawaniu wykluczeń do zestawu filtrów słownika.

1

Do korzystania częściowych ciągów wykluczyć wiersze i zawierać spacje należy użyć

'From Jeeped's code 
Dim dVals As Scripting.Dictionary 
Set dVals = CreateObject("Scripting.Dictionary") 
dVals.CompareMode = vbTextCompare  


Dim col3() As Variant 
Dim col3init As Integer 

'Swallow row3 into an array; start from 1 so it corresponds to row 
For col3init = 1 to Sheets("Sheet1").UsedRange.Rows.count 
    col3(col3init) = Sheets("Sheet1").Range(Cells(col3init,3),Cells(col3init,3)).Value 
Next col3init 

Dim excludeArray() As Variant 
'Partial strings in below array will be checked against rows 
excludeArray = Array("MK1", "MK2", "MK3") 

Dim col3check As Integer 
Dim excludecheck as Integer 
Dim violations As Integer 
For col3check = 1 to UBound(col3) 
    For excludecheck = 0 to UBound(excludeArray) 
     If Instr(1,col3(col3check),excludeArray(excludecheck)) <> 0 Then 
      violations = violations + 1 
      'Sometimes the partial string you're filtering out for may appear more than once. 
     End If 
    Next col3check 

    If violations = 0 and Not dVals.Exists(col3(col3check)) Then 
     dVals.Add Key:=col3(col3check), Item:=col3(col3check) 'adds keys for items where the partial strings in excludeArray do NOT appear 
    ElseIf col3(col3check) = "" Then 
     dVals.Item(Chr(61)) = Chr(61) 'blanks 
    End If 
    violations = 0 
Next col3check  

The dVals.Pozycja (Chr (61)) = Pomysł Chr (61) pochodził z innej odpowiedzi Jeepeda: Multiple Filter Criteria for blanks and numbers using wildcard on same field just doesn't work

Powiązane problemy