Как удалить строки по условию?
Что умеет 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) и тогда удаляться будут строки, значения ячеек которых не равно указанному.
Так же см.:
→Удаление всех пустых строк в таблице
→Удаление пустых столбцов на листе
→Установить Быстрый фильтр
→Фильтр

15722

Второй спобой оч не практичен, при небольшом массиве скажем всего 10 тыс. строк макрос уже зависает на несколько минут… так что для более или менее прилочной табличке данный способ не пойдет!
Здравствуйте.
Как быть вот в таком случае?
Есть данные в таблице. Нужно удалить строки через одну. Т.е удалить все чётные строки, либо не чётные.
В любой пустой столбец записываете формулу: =ЦЕЛОЕ(СТРОКА()/2)=(СТРОКА()/2)
И в зависимости от того, четные или нечетные строки необходимо удалить, фильтруете по ЛОЖЬ(FALSE) или ИСТИНА(TRUE) и удаляете, установив фильтр именно по столбцу с формулой. Как использовать фильтр описано в Способе 1
А как удалить строки с определенным цветом шрифта и фона!?
Написать другой макрос, который будет проверять цвет ячейки.
удаляем строки с ячейками с красной заливкой.
с заливкой понятно, а что делать с цветом шрифта?!
Хотя бы чуточку собственных усилий приложить, чтобы записать макрорекордером изменение цвета шрифта в ячейке и посмотреть как это будет выглядеть. И отвечать можно без восклицательных знаков в конце.
Извините за грубость, впредь буду внимательней.
если это так просто, то написал бы… я вообще понятия не имею как это можно записать?
Как произвести запись макроса —
А выглядеть будет вообще просто:
Скажите пожалуйста, а что нужно добавить в первый макрос, что бы удалялись все строки кроме тех в заданном столбце которых содержится «слово» или пустая ячейка. Может я не очень понятно объяснил, просто мне нужно не по одному параметру выбирать, а по двум))
Дмитрий, нужно добавить условие:
Добрый день, уважаемые!
Подскажите, как сделсть так что бы у меня были сразу введены некие переменные по которым идет проверка?
Например,
а = @ // удалить строку если в строке присутствует аргумент @
а = поступления // удалить строку если в строке присутствует аргумент поступления
а = !!! // удалить строку если в строке присутствует аргумент !!!
а= зачисление //удалить строку если в строке присутствует аргумент зачисление
Скажите пожалуйста как сделать чтобы сразу были заданы параметры, без запроса (т.е. автоматически удалялись строки с наименованием «отчет» и столбец 3).
Наталья, просто вместо строк:
sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "Запрос параметра", "") lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 1))сразу назначаете значение переменным:
sSubStr = "отчет" lCol = 3А если удалять строки вот таким способом
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 то не удаляем.
Дмитрий,подскажите,плиз,а если имеются строки с ячейками с разным цветом шрифта и все их нужно удалить,можно ли это как-то указать для Font.Colorindex?
If Cells(li, lCol).Font.Colorindex <> xlNone Then Rows(li).Delete