Страницы: 1
RSS
Удаление материала после определенного текста
 
Всем доброго времени суток!
Помогите разобраться:
Пытаюсь сделать макрос на обработку крупного прайса. Прайс крупный - то 2800 позиций, то 3000, то 2500. В конце прайса идет ручной инструмент, мне он не нужен, как "заставить" эксель найти фразу "ручной инструмент", и удалить эту строку и все, что под ней находится, и наоборот?
Буду очень признателен за помощь!
 
Здравствуйте. Жмете Ctrl+F--Найти--нужный текст--Найти далее. Активируется первая сверху найденная ячейка, где есть этот текст. От неё Shift+Crl+(стрелка вниз или вверх по надобность)--ПКМ--удалить-- строку--ОК.
Всё это поэтапно можно записать макрорекордером, код немного "причесать" и пользоваться. Что не получится, задать вопрос на форуме.
Изменено: gling - 03.06.2017 20:18:18
 
Цитата
gling  Подскажите пожалуйста, данные манипуляции запомнит макрос?
Изменено: dimka7let - 03.06.2017 21:34:23
 
Приведите пример, надо видеть для написания макроса, где находится фраза Ручной инструмент
 
Цитата
dimka7let написал:
данные манипуляции запомнит макрос?
Запомнит, но нужно будет менять, удалять выше найденного или ниже. И без примера, вряд ли кто вам поможет.
 
Цитата
Увы данный метод выделят лишь столбец, а нужно выделять все вместе с строкой, где написано "Ручной инструмент"
Изменено: dimka7let - 03.06.2017 21:34:50
 
Цитата
dimka7let написал:
данные манипуляции запомнит макрос?
Да. Главное, перед поиском выделять целые столбцы, в которых надо найти фразу.
Далее использовать именно указанные клавиши - Ctrl+Стрелка и т.д. Это позволит сделать макрос более универсальным к разным таблицам.

Ну и в общем-то вот готовый код. Правда, он может быть будет не очень понятен, но он может удалять строки как сверху, так и снизу от искомой фразы:
Код
Sub FindDelete()
    Dim rf As Range, llastcell As Range
    Dim IsDown As Boolean
    'Запрашиваем какие строки удалять - ниже найденного или выше
    IsDown = (MsgBox("Удалить строки ниже?", vbYesNo, "Запрос") = vbYes)
    'пробуем найти фразу "ручной инструмент"
    '   фраза ищется по части ячейки, т.е. ячейка может помимо указанного значения содержать и другие
    '   чтобы искать точное соответствие, заменить xlPart на xlWhole
    On Error Resume Next
    Set rf = ActiveSheet.Cells.Find("ручной инструмент", , xlValues, xlPart, MatchCase:=False)
    On Error GoTo 0
    'если нашли
    If Not rf Is Nothing Then
        If IsDown Then 'удаляем все строки ниже найденной
            Set llastcell = ActiveCell.SpecialCells(11)
            Range(rf.Offset(1), llastcell).EntireRow.Delete
        Else 'удаляем все строки выше найденной
            Range("A1", rf.Offset(-1)).EntireRow.Delete
        End If
    End If
End Sub
Изменено: The_Prist - 03.06.2017 20:30:52
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Sub Poisk()
Dim iLastRow As Long
Dim FoundInstrument As Range
 iLastRow = Cells(Rows.Count, "B").End(xlUp).Row
    Set FoundInstrument = Columns("B").Find("Ручной инструмент", , xlValues, xlWhole)
    If Not FoundInstrument Is Nothing Then
      Rows(FoundInstrument.Row & ":" & iLastRow).Delete
    End If
End Sub
 
Большое спасибо тем, кто откликнулся!

The_Prist Все работает, спасибо, только выбор варианта с всплывающим окном мне ни к чему)) Плюс он оставляет саму строчку с надписью "ручной инструмент".

Kuzmich Большое спасибо! Сначала не мог понять - почему в примере работает, а в полном прайсе - нет - оказалось - в полном прайсе "Ручной инстремнт" находился в столбце D.
Буду пользоваться Вашим вариантом!

Еще раз большое всем спасибо! Вопрос решен! Тему можно закрыть.
Изменено: dimka7let - 03.06.2017 21:32:17
 
Цитата
dimka7let написал:
только выбор варианта с всплывающим окном мне ни к чему
Просто слово "наоборот" навело на мысль, что надо удалить сначала снизу, а потом наоборот - сверху
Чтобы удаляло и саму строку надо просто в этом блоке:
Код
If IsDown Then 'удаляем все строки ниже найденной
        Set llastcell = ActiveCell.SpecialCells(11)
            Range(rf.Offset(1), llastcell).EntireRow.Delete
        Else 'удаляем все строки выше найденной
            Range("A1", rf.Offset(-1)).EntireRow.Delete
        End If
удалить .Offset(-1) и .Offset(1)

А если всплывающее окно не нужно - уберите и все. В коде есть на него отсылка. Просто вместо MsgBox можете поставить
IsDown - True - будет удалять все от и до конца.

P.S. Если создаете тему на нескольких форумах - информируйте об этом.
Изменено: The_Prist - 03.06.2017 21:11:26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
dimka7let, кнопка цитирования не для ответа! Вернитесь в свои сообщения и удалите эти горе-цитаты.
Страницы: 1
Читают тему
Наверх