Страницы: 1
RSS
Найти и удалить строки по списку минус слов
 
Здравствуйте! Помогите решить задачку, нужно на Листе1 столбец A, проверить все строки по минус словам которые даны на Листе2, если на Листе1 встречается минус слово, эту строку полностью нужно удалить. Спасибо:)
 
Здравствуйте. На форуме полно тем по условному удалению строк. Воспользуйтесь поиском и найденное подстройте под себя.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Думаю что непросто будет найти подходящую тему - про удаление тем полно, а вот как отобрать нужные строки именно в этой задаче - не помню тем, если и были, то мало.
Так что вот например такой код на скору руку для Windows:
Код
Sub tt()
Dim a(), i&, el
Application.ScreenUpdating = False
With CreateObject("scripting.dictionary"): .comparemode = 1
a = Sheets(2).[a1].CurrentRegion.Value
For i = 1 To UBound(a): .Item(a(i, 1)) = 0&: Next
a = Sheets(1).[a1].CurrentRegion.Value
For i = UBound(a) To 1 Step -1
For Each el In Split(a(i, 1))
If .exists(el) Then Sheets(1).Rows(i).Delete: Exit For
Next
Next
End With
Application.ScreenUpdating = True

End Sub
 
Доброе время суток
Присоединюсь к Игорю. Тема не избитая. Ещё один вариант на регулярных (не пропадать же добру этой темы ;)
Успехов.
 
Спасибо большое, оба способа работают отлично 8)
 
Андрей VG, ваш способ хорош тем что наглядно можно увидеть что отфильтровывается и внести коррективы. Но есть один момент при использовании большого словаря (от 10 тыс минус слов) происходит сильный загруз процессора  :( .

Hugo, способ HUGO вроде быстрый, не пробовал больше 2000 слов, но не видно что удалилось, хотя изначально об этом сам не просил
Изменено: DOMINANT - 09.10.2015 13:40:37
 
Андрей VG, кстати почему то английские слова пропускает в словаре, например carmate, sdi, dci , тоже самое с цифрами 2107, 2109, 2014
Изменено: DOMINANT - 09.10.2015 16:42:04
 
Нет проблем моим кодом вместо удалений проставить единички, по которым позже удалить что угодно вручную.
 
Цитата
DOMINANT написал:
Андрей VG, кстати почему то английские слова пропускает в словаре, например carmate, sdi, dci , тоже самое с цифрами 2107, 2109, 2014
Пример для доведения до ума по собственным потребностям. Хотя лучше уж пример Игоря модифицировать, он куда быстрее.
 
Цитата
Hugo написал:
Нет проблем моим кодом вместо удалений проставить единички, по которым позже удалить что угодно вручную.
Здравствуйте.
Помогите пожалуйста разобраться куда проставить единички, чтобы все сработало как нужно (чтобы он не удалял а единичку выставлял)
 
wb1, замените 10ю строку на:
Код
If .exists(el) Then Sheets(1).Cells(i, УКАЖИТЕ_СВОЙ_НОМЕР_СТОЛБЦА).Value = 1: Exit For
И замените УКАЖИТЕ_СВОЙ_НОМЕР_СТОЛБЦА на то, что нужно.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Спасибо, все получилось. Есть проблема - он меняет на единички только слова, причем регистр должен соответствовать. Ну регистр еще ладно, его можно встроенными формулами привести к единому значению, а вот как быть с цифрами? например 'мазда 323' или просто '323' - он игнорирует.
 
С регистром думаю ошибаетесь, или код изменили - но в любом случае без примера говорить рано.
Ну а с числами просто - в списке имеете числа, а проверяте текст - вот и не находит. Нужно всё приводить к одному типу - думаю оптимально и надёжно в обоих случаях применить Trim() - так и возможные пробелы уберёте, которые вполне возможны при ручном заполнении файлов.
 
Да, вероятно в случае с регистром не работало из-за лишних пробелов.
Цитата
Hugo написал:
думаю оптимально и надёжно в обоих случаях применить Trim()
А можете показать код, я не понимаю как это сделать((  
 
Достаточно один раз применить Trim():
Код
        For i = 1 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next

А добавлять в список для поиска "mazda 5" нет смысла - в словаре оно будет, на когда просматривается первый лист, то там анализируются слова! Отдельно каждое слово!

Но можно доработать - сперва проверяем всё значение, затем уже каждое слово:
Код
Sub tt()
    Dim a(), i&, el
    Application.ScreenUpdating = False
    With CreateObject("scripting.dictionary"): .comparemode = 1
        a = Sheets(2).[a1].CurrentRegion.Value
        For i = 1 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next
        a = Sheets(1).[a1].CurrentRegion.Value
        For i = UBound(a) To 1 Step -1
            If .exists(Trim(a(i, 1))) Then
                Sheets(1).Cells(i, 2).Value = 1
            Else
                For Each el In Split(a(i, 1))
                    If .exists(el) Then Sheets(1).Cells(i, 2).Value = 1: Exit For
                Next
            End If
        Next
    End With
    Application.ScreenUpdating = True

End Sub

Ну и вывод сделал рядом, чтоб не портить исходные данные.
Изменено: Hugo - 13.03.2016 18:21:42
 
Hugo, очень круто. Спасибо!!
 
Цитата
Hugo написал:
Но можно доработать - сперва проверяем всё значение, затем уже каждое слово:
Добрый день! Применил Ваш макрос- спасибо! Хотелось бы спросить, как можно применять не точные слова из списка минус-слов, а словоформы? А еще было бы здорово, если бы найденные слова окрасились бы в исходном тексте!!
Страницы: 1
Читают тему
Наверх