Удалить строку, если ячейки равны набору значений - PullRequest
0 голосов
/ 19 февраля 2019

Я создал макрос для создания ежедневного отчета.Часть макроса, которая находит значение в столбце AN и удаляет всю строку (код, отредактированный для удаления строк, начиная с последней использованной строки), работает хорошо.В следующем примере удаляются все строки, которые не содержат значение «CAT», «BAT» или «DOG» в столбце AN.

'False screen updating
  Application.ScreenUpdating = False
'deleting all other types other than CAT from "samples" tab (excluding the header row, row 1)
  Sheets("sample").Select
  Lastrow = Cells(Rows.Count, "AN").End(xlUp).Row
'Deleting rows from bottom up
    For i = Lastrow To 2 Step -1
        If Range("AN" & i).Value <> "CAT" And _
           Range("AN" & i).Value <> "BAT" And _
           Range("AN" & i).Value <> "DOG" Then
             Rows(i).EntireRow.Delete
        End If
    Next i

Однако, хотелось бы создать другуюSub, который удаляет все строки, которые do содержат определенный набор значений. Я попытался заменить <> на = и == ,однако ни одна из них не работала и строки не были удалены

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

Спасибо всем за помощь в решении этой проблемы.Я обнаружил, что основной причиной моей проблемы было просто выражение условия в конце моей строки If / Then.В выражении « And_ » говорилось: «Если ячейка равна CAT, BAT и DOG, то удалить строку« NOT ». Если ячейка равна CAT или BAT или DOG, удалить строку».Замена " And_ " на " Or_ " исправила эту проблему.

'False screen updating
  Application.ScreenUpdating = False
'deleting all other types other than CAT from "samples" tab (excluding the header row, row 1)
  Sheets("sample").Select
  Lastrow = Cells(Rows.Count, "AN").End(xlUp).Row
'Deleting rows from bottom up
    For i = Lastrow To 2 Step -1
        If Range("AN" & i).Value = "CAT" Or _
           Range("AN" & i).Value = "BAT" Or _
           Range("AN" & i).Value = "DOG" Or _
           Range("AN" & i).Value = "" Then
             Rows(i).EntireRow.Delete
        End If
    Next i

Однако я также хотел бы удалить строки, если ячейки имеют значение Пробел "" .Почему Саб игнорирует эту строку?

  Range("AN" & i).Value = "" Then

Спасибо!

0 голосов
/ 20 февраля 2019

Сайт, который может помочь вам быть следующим.

https://www.excelcampus.com/vba/delete-rows-cell-values/ Я немного изменил код.

Sub Delete_Rows_Based_On_Value()
'Apply a filter to a Range and delete visible rows
'Source: https://www.excelcampus.com/vba/delete-rows-cell-values

    Dim ws As Worksheet

      'Set reference to the sheet in the workbook.
      Set ws = ThisWorkbook.Worksheets("sampel")
      ws.Activate 'not required but allows user to view sheet if warning message appears

      'Clear any existing filters
      On Error Resume Next
        ws.ShowAllData
      On Error GoTo 0

      '1. Apply Filter
      ws.Range("AN3:BG1000").AutoFilter Field:=1, Criteria1:="<>CAT"

      '2. Delete Rows
      Application.DisplayAlerts = False
        ws.Range("B1:G1000").SpecialCells(xlCellTypeVisible).Delete
      Application.DisplayAlerts = True

      '3. Clear Filter
      On Error Resume Next
        ws.ShowAllData
      On Error GoTo 0

    End Sub
0 голосов
/ 20 февраля 2019

Ниже приведен пример удаления строк на основе критерия в столбце А. Помните, что если мы удаляем строки, мы возвращаемся назад, чтобы избежать ошибок индекса.

Попробуйте:

Option Explicit

Sub test()

    Dim Lastrow As Long, i As Long

    With ThisWorkbook.Worksheets("Sheet1")

        Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row

        'Where you delete you go backwards
        For i = Lastrow To 2 Step -1
            If .Range("A" & i).Value = "CAT" Then
                .Rows(i).EntireRow.Delete
            End If

        Next i

    End With

End Sub
0 голосов
/ 19 февраля 2019

Я бы хотел сделать это так:

Sub DeleteRows()
    Dim i As Integer
    Dim sht As Worksheet
    Set sht = ThisWorkbook.Sheets("sample")
    i=1

    While sht.(i,1) <> "" 'Assuming first column is full of data to the bottom
        If sht.Range("AN" & i) = "CAT" Then
              sht.Rows(i).EntireRow.Delete
        Else
            i=i+1
        End If
    Wend
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...