2013-10-21 149 views
2

在我的數據分析(First Question)的持續傳奇中,我想要刪除其部門(字段7)不是101,102或103的所有行(名稱已更改以保護無辜)。數據中有大約100個部門,因此使用Criteria1:=Array("104", "105", "106",等是不切實際的。Excel VBA自動過濾器除三個之外

我願做這樣的事情:

myrange.AutoFilter Field:=7, Criteria1:="<>101", Operator:=xlOr, Criteria2:="<>102", Operator:=xlOr, Criteria3:="<>103"

但Excel不能識別超過2個標準。我可以添加一個幫助列,並讓宏在每行中運行(如果是101,102或103,那麼value = Yes),過濾掉所有剩下的內容,但是我將它保存爲最後一行採取。

有沒有辦法讓Autofilter Criteria1不等於數組?喜歡的東西:

myrange.AutoFilter Field:=7, Criteria1:="<>" & Array("101", "102", "103")

回答

2

記住我們的目標是刪除不匹配行; AutoFilter只是幫助實現目標的一種工具。如果AutoFilter不能滿足您的需求,請選擇其他方法。考慮:

Sub AllBut() 
    Dim rTable As Range, r As Range 
    Dim rDelete As Range 
    Set rTable = Selection 
    Set rDelete = Nothing 
    For Each r In rTable.Columns(7).Cells 
     v = r.Value 
     If v <> "101" And v <> "102" And v <> "103" Then 
      If rDelete Is Nothing Then 
       Set rDelete = r 
      Else 
       Set rDelete = Union(r, rDelete) 
      End If 
     End If 
    Next 

    If Not rDelete Is Nothing Then rDelete.EntireRow.Delete 
End Sub 

這裏我們選擇要處理的數據塊(不包括標題行)。該宏掃描該塊的第7列,並刪除與該條件不匹配的任何行。

只剩下101個,102個和103個。

+0

@ garys-student我很難跟着這個。我假設第6行的意思是「對於我的數據的G列中的每個單元格」,但我不確定這是怎麼回事,因爲從未設置「r」的範圍。另外,我不熟悉'Union'函數。我是否正確地假設它將當前單元格添加到「rDelete」範圍? –

+0

另外,不需要聲明'v'嗎? –

+1

@SMPerron:你的假設是正確的,在For循環中,每次通過循環時r都是「設置的」,並且不需要明確設置。如果v不變暗,則認爲它是變體。打開一個新的,新的工作簿,把一些臨時數據放在裏面,然後嘗試一下宏。如果事情出錯,你的真實數據不會被破壞.....祝你好運! –

2

由於這是關於AutoFilter method,我將提供此方法,其中涉及使用Scripting.Dictionary object來模擬如果在工作表上手動執行的過程。

在工作表上,用戶將應用AutoFilter,然後使用列G的下拉菜單關閉101,102和103的值。剩下的將被刪除。在VBA中,我們可以抓取所有列G並填充字典對象,其值不是101,102或103,並將其用作過濾器操作的標準。

Sub filterNotThree() 
    Dim d As Long, dDELs As Object, vVALs As Variant 

    Set dDELs = CreateObject("Scripting.Dictionary") 

    With Worksheets("Sheet6") 
     If .AutoFilterMode Then .AutoFilterMode = False 
     With .Cells(1, 1).CurrentRegion 
      'grab all of column G (minus the header) into a variant array 
      vVALs = .Resize(.Rows.Count - 1, 1).Offset(1, 6).Value2 

      'populate the dictionary object with the values that are NOT 101, 102, or 103 
      For d = LBound(vVALs, 1) To UBound(vVALs, 1) 
       Select Case vVALs(d, 1) 
        Case 101, 102, 103 
         'do not add 
        Case Else 
         'not a match, add it to the delete list 
         'the AutoFilter criteria needs to be text 
         ' so we set the Keys as text and the Items as numbers 
         dDELs.Item(CStr(vVALs(d, 1))) = vVALs(d, 1) 
       End Select 
      Next d 

      'check to make sure there is something to filter on 
      If CBool(dDELs.Count) Then 
       'filter on the dictionary keys 
       .AutoFilter field:=7, Criteria1:=dDELs.keys, Operator:=xlFilterValues 

       'delete the visible rows (there has to be some) 
       .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0).EntireRow.Delete 
      End If 

     End With 
     If .AutoFilterMode Then .AutoFilterMode = False 
    End With 

    dDELs.RemoveAll: Set dDELs = Nothing 
End Sub 

filterNotThree_before
數據

filterNotThree_after
數據filterNotThree子過程後filterNotThree子過程之前

0

我在做類似的事情,但對於兩個領域,這句法爲我工作:

myrange.AutoFilter Field:=7, Criteria1:="<>101", Operator:=xlAnd, Criteria2:="<>102", Operator:=xlAnd 

希望它有幫助。