Как удалить строки в Excel листе на основе критериев - PullRequest
1 голос
/ 19 октября 2011

У меня есть книга Excel, в листе 1 в столбце A, ЕСЛИ значение этого столбца = ERR Я хочу удалить его (всю строку), как это возможно?

PS: сохранить вИмейте в виду, что я никогда не использовал VBA или макросы, поэтому подробное описание очень ценится.

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

Самый быстрый метод:

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

Второй самый быстрый метод (множество вариаций и этого):

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

Метод автофильтра для нескольких листов:

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
2 голосов
/ 19 октября 2011
  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

Обратите внимание, что любые операции, которые вы выполняете с использованием активного листа, будут затронуты на активированном в настоящий момент листе.

Как вы говорите, что вы начинающий, почему вы не записываете макрос и проверяете, это самый лучший способчтобы автоматизировать процесс, увидев фоновый код

Просто найдите вкладку с макросами на листе и нажмите «Запись нового макроса», затем выберите любую строку и сделайте то, что вы хотели сделать, скажем, удалив всю строку,просто удалите всю строку, а затем вернитесь на вкладку макросов и нажмите «Остановить запись».

Теперь нажмите alt + F11, и вы попадете в редактор VBA, где вы найдете несколько рабочих листов и модулей в поле проводника проекта vba., если вы не можете найти его, воспользуйтесь вкладкой просмотра в редакторе VBA. Теперь нажмите на module1 и посмотрите записанный макрос, вы найдете что-то вроде этого

        selection.entirerow.delete

Надеюсь, я вам немного помог,и если вам нужна дополнительная помощь, пожалуйста, дайте мне знать, спасибо

2 голосов
/ 20 октября 2011

Использование автофильтрации вручную или с VBA (как показано ниже) - очень эффективный способ удаления строк

код ниже

  1. Работает на всем используемом диапазоне, т.е. обрабатывает пробелы
  2. Можно легко перенести на другие листы, изменив strSheets = Array(1, 4). т.е. этот код в настоящее время выполняется на первом и четвертом листах

     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
    
0 голосов
/ 19 октября 2011

Если в ячейках столбца A всегда есть значения и что данные находятся на первом листе, то что-то вроде этого должно делать то, что вы хотите:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...