Come eliminare righe in foglio di lavoro di Excel basato su criteri

Ho una cartella di lavoro excel, nel foglio di lavoro1 nella colonna A, se il valore di quella colonna = ERR desidero che venga eliminato (l'intera row), come è ansible?

PS: tenere presente che non ho mai usato VBA o Macro prima, quindi una descrizione dettagliata è molto apprezzata.

Utilizzando un autofilter manualmente o con VBA (come sotto) è un modo molto efficace per rimuovere le righe

Il codice qui sotto

  1. Funziona su tutta la linea usata, cioè gestirà spazi vuoti
  2. Può essere adattabile ad altri fogli modificando strSheets = Array(1, 4) . cioè questo codice è attualmente in esecuzione sui primi e quarta fogli

      Option Explicit Sub KillErr() Dim ws As Worksheet Dim lRow As Long Dim lngCol As Long Dim rng1 As Range Dim strSheets() Dim strws As Variant strSheets = Array(1, 4) For Each strws In strSheets Set ws = Sheets(strws) lRow = ws.Cells.Find("*", , xlValues, , xlByRows, xlPrevious).Row lngCol = ws.Cells.Find("*", , xlValues, , xlByColumns, xlPrevious).Column Application.ScreenUpdating = False ws.Rows(1).Insert Set rng1 = ws.Range(ws.Cells(1, lngCol), ws.Cells(lRow + 1, lngCol)) With rng1.Offset(0, 1) .FormulaR1C1 = "=RC1=""ERR""" .AutoFilter Field:=1, Criteria1:="TRUE" .EntireRow.Delete On Error Resume Next .EntireColumn.Delete On Error GoTo 0 End With Next Application.ScreenUpdating = True End Sub 
  sub delete_err_rows() Dim Wbk as Excel.workbook 'create excel workbook object Dim Wsh as worksheet ' create excel worksheet object Dim Last_row as long Dim i as long Set Wbk = Thisworkbook ' im using thisworkbook, assuming current workbook ' if you want any other workbook just give the name ' in invited comma as "workbook_name" Set Wsh ="sheetname" ' give the sheet name here Wbk.Wsh.activate ' it means Thisworkbook.sheets("sheetname").activate ' here the sheetname of thisworkbook is activated ' or if you want looping between sheets use thisworkbook.sheets(i).activate ' put it in loop , to loop through the worksheets ' use thisworkbook.worksheets.count to find number of sheets in workbook Last_row = ActiveSheet.Cells(Rows.count, 1).End(xlUp).Row 'to find the lastrow of the activated sheet For i = lastrow To 1 step -1 if activesheet.cells(i,"A").value = "yourDesiredvalue" activesheet.cells(i,"A").select ' select the row selection.entirerow.delete ' now delete the entire row end if Next i end sub 

Notare tutte le operazioni che si eseguono utilizzando il foglio di attivi, sarà interessato nel foglio attualmente triggersto

Come dice il tuo un ricercatore, perché non registra una macro e controlla, questo è il modo migliore per automatizzare il tuo process visto il codice di background

Trova appena la scheda di macro sul foglio e fai clic su Registra nuova macro, quindi seleziona una qualsiasi della row e fai quello che volevi fare, diciamo l'eliminazione dell'intera row, eliminiamo l'intera row e torniamo ora alla scheda delle macro e fai clic su stop logging .

Ora cliccate su alt + F11, questo ti porterà all'editor VBA, where si trovano alcuni fogli di lavoro e moduli nel field dell'esploratore del progetto vba, se non lo trovate ricercarlo usando la scheda di visualizzazione dell'editor VBA. Ora clicca sul module1 e vedi la macro registrata, troverai qualcosa di simile

  selection.entirerow.delete 

Spero che ti ho aiutato un pò, e se hai bisogno di aiuto, per favore fathemes sapere, grazie

Metodo più veloce:

 Sub DeleteUsingAutoFilter() Application.ScreenUpdating = False With ActiveSheet .AutoFilterMode = False .Columns("A").AutoFilter Field:=1, Criteria1:="ERR" .AutoFilter.Range.Offset(1, 0).EntireRow.Delete .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub 

Secondo metodo più veloce (molte varianti a questo anche):

 Sub DeleteWithFind() Dim rFound As Range, rDelete As Range Dim sAddress As String Application.ScreenUpdating = False With Columns("A") Set rFound = .Find(What:="ERR", After:=.Resize(1, 1), SearchOrder:=xlByRows) If Not rFound Is Nothing Then Set rDelete = rFound Do Set rDelete = Union(rDelete, rFound) Set rFound = .FindNext(rFound) Loop While rFound.Row > rDelete.Row End If If Not rDelete Is Nothing Then rDelete.EntireRow.Delete End With Application.ScreenUpdating = True End Sub 

Metodo autofilter per più fogli:

 Sub DeleteUsingAutoFilter() Dim vSheets As Variant Dim wsLoop As Worksheet Application.ScreenUpdating = False '// Define worksheet names here vSheets = Array("Sheet1", "Sheet2") For Each wsLoop In Sheets(vSheets) With wsLoop .AutoFilterMode = False .Columns("A").AutoFilter Field:=1, Criteria1:="ERR" .AutoFilter.Range.Offset(1, 0).EntireRow.Delete .AutoFilterMode = False End With Next wsLoop Application.ScreenUpdating = True End Sub 

Supponendo che ci siano sempre valori nelle celle nella colonna A e che i dati siano nel primo foglio, qualcosa di simile dovrebbe fare quello che vuoi:

 Sub deleteErrRows() Dim rowIdx As Integer rowIdx = 1 Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) While ws.Cells(rowIdx, 1).Value <> "" If ws.Cells(rowIdx, 1).Value = "ERR" Then ws.Cells(rowIdx, 1).EntireRow.Delete Else rowIdx = rowIdx + 1 End If Wend End Sub