2017-10-13 56 views
0

編輯:我的變量包含通配符。我在網上看到一些說如果我使用通配符,自動過濾器只能包含兩個條件。這是真的?如果是這樣,這可能是我的問題。不幸的。 END編輯基於數組的超過3個元素的自動過濾器

我想過濾我的數據,以顯示數據是否包含數組中的六個項目之一。元素是字符串變量。我的工作代碼是:

With ActiveSheet 
    .Columns("J").AutoFilter Field:=1, Criteria1:=Array(d3, d2), _ 
    Operator:=xlFilterValues 
End With 

這個想法背後的想法是爲我想要完成的。但是,我實際上想要6個元素的數組,而不僅僅是兩個。不幸的是,當我嘗試添加全部六個元素時,什麼也沒有顯示出來。

With ActiveSheet 
    .Columns("J").AutoFilter Field:=1, Criteria1:=Array(d3, d2, d1, d21, d11, d31), Operator:=xlFilterValues 
End With 

我沒有得到一個錯誤或任何東西。只是沒有出現。有誰知道如何解決這個問題? 我用數組中的兩個元素對字符串(d1,d21等)的各種組合進行了測試,它們都按預期工作,所以問題不在於變量。

回答

1

自動篩選被限制爲2倍的標準用通配符,但版本1適用一個不同的自動篩選爲每個標準和在一臺Union範圍捕獲可見行,那麼隱藏所有行和取消隱藏聯盟


Option Explicit 

Public Sub AutoFilterWithMultipleWildCardCriteria1() 

    Const CRIT = "*3 *5 *7 *9 *11" '= includes empty cells, <> non-empty cells 

    Dim wild As Variant, notWild As Variant, filtr As Range, i As Long 

    wild = Split(CRIT) 
    notWild = Split(Replace(Replace(CRIT, "*", vbNullString), "?", vbNullString)) 

    With Worksheets("Sheet1")       '<-- update your sheet name 
     Application.ScreenUpdating = False 
     .AutoFilterMode = False 

     With .UsedRange.Columns("J") 
      .Rows.Hidden = False 

      'capture first set (for criteria1 = *3) 
      .AutoFilter Field:=1, Criteria1:=wild(0), Operator:=xlOr, Criteria2:=notWild(0) 
      Set filtr = .SpecialCells(xlCellTypeVisible) 

      For i = 1 To UBound(wild)  'union the rest of the sets (*5 *7, etc) 
      .AutoFilter Field:=1, Criteria1:=wild(i), Operator:=xlOr, Criteria2:=notWild(i) 
      Set filtr = Union(filtr, .SpecialCells(xlCellTypeVisible)) 
      Next 

      Sheet1.AutoFilterMode = False 
      .Rows.Hidden = True 
      filtr.Rows.Hidden = False 
     End With 

     Application.ScreenUpdating = True 
     .Cells(1).Activate 
    End With 
End Sub 

版2捕獲滿足在字典中的所有條件的所有記錄,並應用基於字典的鍵陣列上的最終過濾器


Public Sub AutoFilterWithMultipleWildCardCriteria2() 

    Const CRIT = "*3 *5 *7 *9 *11" '= includes empty cells, <> non-empty cells 

    Dim wild As Variant, notWild As Variant, filtr As Object 

    wild = Split(CRIT) 
    notWild = Split(Replace(Replace(CRIT, "*", vbNullString), "?", vbNullString)) 
    Set filtr = CreateObject("Scripting.Dictionary") 

    Application.ScreenUpdating = False 
    With Worksheets("Sheet1") 
     .AutoFilterMode = False 
     With .UsedRange.Columns("J") 
     If .Cells.CountLarge > 1 Then 
      Dim i As Long, itm As Variant 

      For i = 0 To UBound(wild) 
      .AutoFilter Field:=1, Criteria1:=wild(i), Operator:=xlOr, Criteria2:=notWild(i) 
      For Each itm In .SpecialCells(xlCellTypeVisible) 
       filtr(CStr(itm.Value2)) = 0 
      Next 
      Next 

      .AutoFilter Field:=1, Criteria1:=filtr.Keys, Operator:=xlFilterValues 
     End If 
     End With 
    End With 
    Application.ScreenUpdating = True 
End Sub 
+0

哇,這真的很有趣。感謝您的迴應!我從中學到了一些新東西,這是非常理想的,因爲我不得不自學VBA。我相信我將在未來的聯盟範圍內使用 – chairSitter