2013-10-21 17 views
2

데이터 분석 (First Question)의 계속되는 이야기에서 부서 (필드 7)가 101, 102 또는 103이 아닌 행을 모두 삭제하려고합니다. 순진한). 데이터에는 약 백 개의 부서가 있으므로 Criteria1:=Array("104", "105", "106", 등을 사용하는 것은 비현실적입니다.엑셀 VBA 자동 필터

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

을하지만 엑셀은 2 개 이상의 기준을 인식하지 않습니다

나는 같은 것을 할 싶습니다. 도우미 열을 추가하고 각 줄 (101, 102 또는 103, 값 = 예인 경우)을 통해 매크로를 실행하고, 예를 필터링하고, 나머지는 모두 삭제할 수 있습니다. 그러나 마지막으로 저장하고 있습니다. 의지.

Autofilter Criteria1을 (같지 않음) 배열에 연결할 수 있습니까? 뭔가 같이 :

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

답변

2

는 목표를 기억하면 일치하지 않는 행을 삭제하는 것입니다; 자동 필터는 목표를 달성하는 데 도움이되는 유일한 도구입니다. 자동 필터가 필요에 맞지 않으면 다른 방법을 선택하십시오. 다음을 고려하십시오.

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가 Dim'ed가 아닌 경우 Variant로 간주됩니다.새롭고 새로운 통합 문서를 열고 그 안에 일부 스크래치 데이터를 넣은 다음 매크로를 시도하십시오. 일이 잘못되면 실제 데이터가 손상되지 않습니다 ..... 행운을 빌어 요! –

2

AutoFilter method 이니 워크 시트에서 수동으로 수행 할 경우 사용할 절차를 모방하기 위해 Scripting.Dictionary object을 사용하는 방법을 제안합니다.

워크 시트에서 사용자는 자동 필터를 적용한 다음 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

0
나는 비슷한하지만 두 필드를하고 있었다

이 구문은 나를 위해 일한 filterNotThree 하위 절차 전에

filterNotThree_after
데이터 filterNotThree 하위 과정을 거친 후 데이터 :

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

희망이 있습니다.