2011-10-04 49 views
7

Attualmente sto costruendo una macro per formattare un foglio di dati e per rimuovere righe di dati inapplicabili. In particolare, sto cercando di eliminare le righe in cui colonna L = "ABC" e cancellare le righe in cui colonna AA > "DEF".Come eliminare righe in Excel in base a criteri che utilizzano VBA?

Finora sono stato in grado di raggiungere il primo obiettivo, ma non il secondo. Il codice esistente è:

Dim LastRow As Integer 
Dim x, y, z As Integer 
Dim StartRow, StopRow As Integer 

For x = 0 To LastRow 
    If (Range("L1").Offset(x, 0) = "ABC") Then 
    Range("L1").Offset(x, 0).EntireRow.Delete 
    x = x - 1 

End If 

risposta

0

cellulare con il numero 12 è "L" e il numero 27 è "AA"

Dim x As Integer 

x = 1 

Do While x <= ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row 

    If (Cells(x, 12) = "ABC") Then 
    ActiveSheet.Rows(x).Delete 
    Else 
     If (Cells(x, 27) <> "DEF") And (Cells(x, 27) <> "") Then 
     ActiveSheet.Rows(x).Delete 
     Else 
     x = x + 1 
     End If 
    End If 

Loop 

End Sub 
6

Utilizzando una ciclo:

Sub test() 
    Dim x As Long, lastrow As Long 
    lastrow = Cells(Rows.Count, 1).End(xlUp).Row 
    For x = lastrow To 1 Step -1 
     If Cells(x, 12).Value = "ABC" or Cells(x, 27) <> "DEF" Then 
      Rows(x).Delete 
     End If 
    Next x 
End Sub 

Uso autofilter (non testato, probabilmente più veloce):

Sub test2() 
    Range("a1").AutoFilter Field:=12, Criteria1:="ABC", Operator:=xlOr, _ 
          Field:=28, Criteria1:="<>""DEF""" 
    'exclude 1st row (titles) 
    With Intersect(Range("a1").CurrentRegion, _ 
        Range("2:60000")).SpecialCells(xlCellTypeVisible) 
     .Rows.Delete 
    End With 
    ActiveSheet.ShowAllData 
End Sub 
+0

+1 per la direzione, ma dove è DEF :)? – Fionnuala

+0

@Remou: modificato. Grazie ! –

+0

Sì ma, AA <> "DEF". :) – Fionnuala

0
Sub test() 

    Dim bUnion As Boolean 
    Dim i As Long, lastrow As Long 
    Dim r1 As Range 
    Dim v1 As Variant 

    lastrow = Cells(Rows.Count, 1).End(xlUp).Row 
    v1 = ActiveSheet.Range(Cells(1, 12), Cells(lastrow, 27)).Value2 
    bUnion = False 

    For i = 1 To lastrow 
     If v1(i, 1) = "ABC" Or v1(i, 16) <> "DEF" Then 
      If bUnion Then 
       Set r1 = Union(r1, Cells(i, 1)) 
      Else 
       Set r1 = Cells(i, 1) 
       bUnion = True 
      End If 
     End If 
    Next i 
    r1.EntireRow.Delete 

End Sub 
9

è normalmente molto più veloce da utilizzare il filtro automatico, piuttosto che ciclo Ranges

Il codice di seguito crea una colonna di lavoro, quindi utilizzare una formula per rilevare eliminare i criteri e poi di filtro automatico e cancellare i record di risultato

La colonna di lavoro inserisce una formula

=OR(L1="ABC",AA1<>"DEF") nella riga 1 della prima colonna vuota, quindi copia verso il basso fino alla distanza effettiva utilizzata. Quindi qualsiasi record VERO viene cancellato rapidamente con AutoFilter

Sub QuickKill() 
    Dim rng1 As Range, rng2 As Range, rng3 As Range 
    Set rng1 = Cells.Find("*", , xlValues, , xlByColumns, xlPrevious) 
    Set rng2 = Cells.Find("*", , xlValues, , xlByRows, xlPrevious) 
    Set rng3 = Range(Cells(rng2.Row, rng1.Column), Cells(1, rng1.Column)) 
    Application.ScreenUpdating = False 
    Rows(1).Insert 
    With rng3.Offset(-1, 1).Resize(rng3.Rows.Count + 1, 1) 
     .FormulaR1C1 = "=OR(RC12=""ABC"",RC27<>""DEF"")" 
     .AutoFilter Field:=1, Criteria1:="TRUE" 
     .EntireRow.Delete 
     On Error Resume Next 
     'in case all rows have been deleted 
     .EntireColumn.Delete 
     On Error GoTo 0 
    End With 
    Application.ScreenUpdating = True 
End Sub 
+0

perché l'autofilter è più veloce? – lucidbrot

Problemi correlati