Версия для печати

Как удалить строки по условию?

Что умеет Excel

 

Как часто Вам приходится удалять строки в таблицах? Я не имею ввиду все строки, нет. Это просто. Как удалить только определенные строки? У Вас большая таблица и Вы хотите удалить из неё только те строки, определенные ячейки которых содержать то или иное слово(цифру, фразу). Можно воспользоваться несколькими способами. я опишу пару из них.

Способ первый: воспользоваться встроенным фильтром. Для начала его необходимо установить:

  • Выделяем таблицу с данными, включая заголовки. Если их нет — то выделяете с самой первой строки таблицы, в которой необходимо удалить данные
  • устанавливаете филльтр:
    для Excel 2003: Данные-Фильтр-Автофильтр
    для Excel 2007: вкладка Данные-Фильтр(или вкладка Главная-Сортировка и фильтр-Фильтр)

Теперь выбираем условие для фильтра:

в Excel 2003 надо выбрать Условие и в появившейся форме выбрать непосредственно условие(«равно», «содержит», «начинается с» и т.д.), а напротив значение в соответствии с условием.
Для 2007 Excel нужно выбрать Текстовые фильры и либо сразу выбрать одно из предлагаемых условий, либо нажать «Настраиваемый фильтр» и там так же, как в 2003 ввести значения в форме.

После этого удалить отфильтрованные строки. В 2007 Excel могут возникнуть проблемы с удалением отфильтрованных строк, поэтому рекомендую сначала так же прочитать статью: Excel удаляет вместо отфильтрованных строк - все?! Как избежать.

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

Sub Del_SubStr()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long 'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim lMet As Long
 
    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "")
    If sSubStr = "" Then lMet = 0 Else lMet = 1
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))
    If lCol = 0 Then Exit Sub
 
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
 
    Application.ScreenUpdating = 0
    For li = lLastRow To 1 Step -1
        If InStr(Cells(li, lCol), sSubStr) = lMet Then Rows(li).Delete
    Next li
    Application.ScreenUpdating = 0
End Sub
Sub Del_SubStr()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long 'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim lMet As Long

    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "")
    If sSubStr = "" Then lMet = 0 Else lMet = 1
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))
    If lCol = 0 Then Exit Sub

    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

    Application.ScreenUpdating = 0
    For li = lLastRow To 1 Step -1
        If InStr(Cells(li, lCol), sSubStr) = lMet Then Rows(li).Delete
    Next li
    Application.ScreenUpdating = 0
End Sub

Если значение sSubStr не будет указано, то будут удалены строки, ячейки указанного столбца которых, пустые.
Данный код необходимо поместить в стандартный модуль. Вызвать с листа его можно нажатием клавиш Alt+F8, после чего выбрать Del_SubStr и нажать Выполнить. Если в данном коде в строке

If InStr(Cells(li, lCol), sSubStr) = lMet Then Rows(li).Delete
If InStr(Cells(li, lCol), sSubStr) = lMet Then Rows(li).Delete

вместо = lMet указать <> lMet, то удаляться будут строки, не содержащие указанное для поиска значение. Иногда тоже удобно.
Но. Данный код просматривает строки на предмет частичного совпадения указанного значения. Например, если Вы укажете текст для поиска «отчет», то будут удалены все строки, в которых встречается это слово(«квартальный отчет», «отчет за месяц» и т.д.). Это не всегда нужно. Поэтому ниже приведен код, который будет удалять только строки, указанные ячейки которых равны конкретно указанному значению:

Sub Del_SubStr()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long 'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
 
    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "")
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))
    If lCol = 0 Then Exit Sub
 
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
 
    Application.ScreenUpdating = 0
    For li = lLastRow To 1 Step -1
        If Cstr(Cells(li, lCol)) = sSubStr Then Rows(li).Delete
    Next li
    Application.ScreenUpdating = 0
End Sub
Sub Del_SubStr()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long 'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long

    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "")
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))
    If lCol = 0 Then Exit Sub

    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

    Application.ScreenUpdating = 0
    For li = lLastRow To 1 Step -1
        If Cstr(Cells(li, lCol)) = sSubStr Then Rows(li).Delete
    Next li
    Application.ScreenUpdating = 0
End Sub

Здесь так же, как и в случае с предыдущим кодом можно заменить оператор сравнения(Cells(li, lCol) = sSubStr) с равно на неравенство(Cells(li, lCol) <> sSubStr) и тогда удаляться будут строки, значения ячеек которых не равно указанному.

Так же см.:
Удаление всех пустых строк в таблице
Удаление пустых столбцов на листе
Установить Быстрый фильтр
Фильтр



Поддержать автора сайта
Поделиться ссылкой
  1. poly
    27 Октябрь 2011 в 12:11 | #1

    Второй спобой оч не практичен, при небольшом массиве скажем всего 10 тыс. строк макрос уже зависает на несколько минут… так что для более или менее прилочной табличке данный способ не пойдет!

  2. 7 Ноябрь 2011 в 10:10 | #2

    Здравствуйте.
    Как быть вот в таком случае?
    Есть данные в таблице. Нужно удалить строки через одну. Т.е удалить все чётные строки, либо не чётные.

  3. 9 Ноябрь 2011 в 22:20 | #3

    В любой пустой столбец записываете формулу: =ЦЕЛОЕ(СТРОКА()/2)=(СТРОКА()/2)
    И в зависимости от того, четные или нечетные строки необходимо удалить, фильтруете по ЛОЖЬ(FALSE) или ИСТИНА(TRUE) и удаляете, установив фильтр именно по столбцу с формулой. Как использовать фильтр описано в Способе 1

  4. Серж
    21 Январь 2012 в 23:25 | #4

    А как удалить строки с определенным цветом шрифта и фона!?

  5. 22 Январь 2012 в 00:07 | #5

    Написать другой макрос, который будет проверять цвет ячейки.

    If Cells(li, lCol).Interior.Colorindex = 3 Then Rows(li).Delete
    If Cells(li, lCol).Interior.Colorindex = 3 Then Rows(li).Delete

    удаляем строки с ячейками с красной заливкой.

  6. Серж
    23 Январь 2012 в 01:17 | #6

    с заливкой понятно, а что делать с цветом шрифта?!

  7. 23 Январь 2012 в 10:30 | #7

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

  8. Серж
    2 Февраль 2012 в 01:38 | #8

    Извините за грубость, впредь буду внимательней.

  9. Серж
    2 Февраль 2012 в 01:53 | #9

    если это так просто, то написал бы… я вообще понятия не имею как это можно записать?

  10. 2 Февраль 2012 в 09:29 | #10

    Как произвести запись макроса — Что такое макрос и где его искать?
    А выглядеть будет вообще просто:

    If Cells(li, lCol).Font.Colorindex = 3 Then Rows(li).Delete
    If Cells(li, lCol).Font.Colorindex = 3 Then Rows(li).Delete
  11. Дмитрий Зубрилин
    28 Март 2012 в 22:52 | #11

    Скажите пожалуйста, а что нужно добавить в первый макрос, что бы удалялись все строки кроме тех в заданном столбце которых содержится «слово» или пустая ячейка. Может я не очень понятно объяснил, просто мне нужно не по одному параметру выбирать, а по двум))

  12. 29 Март 2012 в 09:01 | #12

    Дмитрий, нужно добавить условие:

    If InStr(Cells(li, lCol), sSubStr) <> lMet And Cells(li, lCol) <> "" Then Rows(li).Delete
    If InStr(Cells(li, lCol), sSubStr) <> lMet And Cells(li, lCol) <> "" Then Rows(li).Delete
  13. Den19
    29 Март 2012 в 14:52 | #13

    Добрый день, уважаемые!

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

    а = @ // удалить строку если в строке присутствует аргумент @
    а = поступления // удалить строку если в строке присутствует аргумент поступления
    а = !!! // удалить строку если в строке присутствует аргумент !!!
    а= зачисление //удалить строку если в строке присутствует аргумент зачисление

  14. Наталья
    10 Апрель 2012 в 09:03 | #14

    Скажите пожалуйста как сделать чтобы сразу были заданы параметры, без запроса (т.е. автоматически удалялись строки с наименованием «отчет» и столбец 3).

  15. 10 Апрель 2012 в 14:57 | #15

    Наталья, просто вместо строк:

    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "")
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))
    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "")
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))

    сразу назначаете значение переменным:

    sSubStr = "отчет"
    lCol = 3
    sSubStr = "отчет"
    lCol = 3
  16. наталья
    20 Апрель 2012 в 16:37 | #16

    А если удалять строки вот таким способом

    iText = Array("желтый", "желтизна")
        For ii = 0 To UBound(iText)
            Set iRange = Worksheets("данные").Columns("D").Find(What:=iText(ii), LookIn:=xlFormulas, Lookat:=xlPart)
            If Not iRange Is Nothing Then
                Do
                    iRange.EntireRow.Delete
                    Set iRange = Worksheets("данные").Columns("D").Find(What:=iText(ii), LookIn:=xlFormulas, Lookat:=xlPart)
                Loop Until iRange Is Nothing
            End If
        Next ii
    iText = Array("желтый", "желтизна")
        For ii = 0 To UBound(iText)
            Set iRange = Worksheets("данные").Columns("D").Find(What:=iText(ii), LookIn:=xlFormulas, Lookat:=xlPart)
            If Not iRange Is Nothing Then
                Do
                    iRange.EntireRow.Delete
                    Set iRange = Worksheets("данные").Columns("D").Find(What:=iText(ii), LookIn:=xlFormulas, Lookat:=xlPart)
                Loop Until iRange Is Nothing
            End If
        Next ii

    только вот никак не могу сделать, чтобы еще по одному условию проверка проходила..если он желтый и равен 0, то удаляем, а если желтый и равен 1 то не удаляем.

  17. Света
    28 Апрель 2012 в 04:25 | #17

    Дмитрий,подскажите,плиз,а если имеются строки с ячейками с разным цветом шрифта и все их нужно удалить,можно ли это как-то указать для Font.Colorindex?

  18. 28 Апрель 2012 в 08:13 | #18

    If Cells(li, lCol).Font.Colorindex <> xlNone Then Rows(li).Delete

Комментарий будет добавлен после проверки администратором.
Комментарии, не имеющие отношения к комментируемой статье, будут удаляться без уведомления и объяснения причин. Если есть вопрос по проблеме в Excel- добро пожаловаться на Форум