Страницы: 1
RSS
Удалить строки, соответствующие двум параметрам
 
Добрый день.
Имеется файл отчета (генерируется программой). В нем необходимо удалить строки соответствующие двум параметрам :
1. по столбцу NAME - остаются строки в которых есть "вменяемые" имена. Например "Profil 33 x 33 x  457.0 mm" , строки с именами типа "" или "-" должны удаляться.
2. по столбцу HIDDEN - остаются строки со значением "" , строки с любым другим значением типа "1" или "3.0"
т.е. в конечном файле должны остаться только строки вида :
PATH                                   NAME                       HIDDEN
"Model/Component#1" "Profil 33 x 33 x  212.0 mm" ""
"Model/Component#2" "Profil 33 x 33 x  702.0 mm" ""
строки вида:
PATH                                    NAME                      HIDDEN
"Model"                          ""                                       ""
"Model/Component#7" ""                                       ""
"Model/Component#9" ""                                       ""
"Model/Component#4" "Profil 33 x 33 x  457.0 mm" "1"
"Model/Component#4" "Profil 33 x 33 x  457.0 mm" "1"
должны удаляться.
Количество строк заранее не известно. Положение столбцов NAME и HIDDEN может меняться (могут добавляться  доп. значения в других столбцах) т.е. ориентироваться можно только по названию столбца.
Можно ли это реализовать формулами ?
Я нашел только макрос :
Код
Sub DeleteEmptyRows()
    LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    Application.ScreenUpdating = False
    For r = LastRow To 1 Step -1
        If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
    Next r
End Sub

он удаляет все пустые строки, можно ли изменить строку условия ( if ) в соответствии и условпями описанными выше ?
 
Удаление строк по условию:
http://excelvba.ru/code/ConditionalRowsDeleting

(есть варианты кода с разным количество условий - см. также и комменты к статье)
 
EducatedFool, Спасибо, буду смотреть.

вроде нашел похожий макрос :
Код
Sub УдалениеСтрок()
 Dim ra As Range, delra As Range, cell As Range
 Set ra = Range([d1], Range("d" & Rows.Count).End(xlUp)) ' весь столбец D

 Application.ScreenUpdating = False ' отключаем обновление экрана
 
 ' перебираем все ячейки в столбце D, и выбираем только пустые ячейки
 ' заодно смотрим, не содержит ли ячейка справа (столбец E) содержала значение 1
 For Each cell In ra.Cells
 If (cell = "" )  or cell.Next = "1" Then
 ' добавляем ячейку в диапазон для удаления
 If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
 End If
 Next cell
 
 ' если подходящие строки найдены - удаляем их
 If Not delra Is Nothing Then delra.EntireRow.Delete
End Sub

так как файл .xls получается из текстового файла .csv я могу получить в нужных ячейках пустые значения (см. приложение).
теперь по условию If (cell = "")  or cell.Next = "1" если ячейка в столбце D (NAME) не содержит значение или ячейка рядом в столбце E (HIDDEN) содержит единицу всё правильно работает - строка удаляется.
только подгонять нужный столбец под букву D нужно вручную.
Можно ли назначить проверяемый столбец условием что в первой строке этого столбца находится значение NAME

P.S. Спасибо вам за ваши макросы.
Изменено: Сергей Иванов - 11.08.2018 00:36:26
 
вот так будет работать:

Код
Sub УдалениеСтрок()
    Dim ra As Range, delra As Range, cell As Range
    Set ra = Range("1:1").Find("NAME", , xlValues, xlWhole, , , False)
    If ra Is Nothing Then MsgBox "Не найден столбец «NAME»", vbCritical: Exit Sub

    Set ra = Range(ra, Cells(Rows.Count, ra.Column).End(xlUp)) ' весь столбец NAME

    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ' перебираем все ячейки в столбце D, и выбираем только пустые ячейки
    ' заодно смотрим, не содержит ли ячейка справа (столбец E) содержала значение 1
    For Each cell In ra.Cells
        If (cell = "") Or (cell.Next = "1") Then
            ' добавляем ячейку в диапазон для удаления
            If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
        End If
    Next cell

    ' если подходящие строки найдены - удаляем их
    If Not delra Is Nothing Then delra.EntireRow.Delete
End Sub
 
EducatedFool,
Да, все отлично работает !
Спасибо.
 
...пришла беда откуда не ждали, напал на нашу землю проклятый буржуин - поменялся формат таблицы (перед столбцом HIDDEN добавился столбец LENX , теперь HIDDEN не Next за NAME)
и теперь удаляются строки только с пустыми ИМЕНАМИ (удаление по HIDDEN=1) не работает.
Помогите прикрутить вторую проверку и удаление по HIDDEN .
Существует вероятность что столбец HIDDEN может перемещаться, т.е. нужно ориентироваться не на его местоположение, а на его имя.
 
У меня вопрос, надеюсь по теме, про удаление строк в таблице, но не по условию содержания определенного текста в ячейке. Мне необходимо удалить строки в которых не соблюдается условие - разница между днями должна быть не меньше "7". Т.е. те строки в которых разница между днями меньше "7" - удаляются. Как можно реализовать?
Изменено: Iaroslav Gribanov - 02.05.2013 15:01:12 (добавлен файл)
 
Цитата
Iaroslav Gribanov пишет: ... разница между днями должна быть не меньше "7"...
Задание, похоже, учебно-тренировочное - потому как выплеснуть младенца запросто...
Впрочем, в доп поле минусуйте дни, а затем фильтром и... делом... ;)
ps На куске показать бы стоило: каким макаром из чего ЧТО должно получиться.
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Цитата
Z пишет:
в доп поле минусуйте дни, а затем фильтром
Для 500 строк может быть и годится (хотя тоже не по фэншую), а вот для более внушительной выборки - уже проблематично.
Цитата
Z пишет:
На куске показать бы стоило
Исправляюсь. Добавляю файл с тем как было и должно быть.
 
Дни минусовать формулой думаю не получится.

Как-то некрасиво, самому не нравится... Но работает:

Код
Sub tt()
    Dim i&, d1 As Date, d2 As Date
    i = 3
    On Error Resume Next
    Do While Len(Cells(i, 1))
        i = i + 1
        If Len(Cells(i, 1)) Then
            d1 = CDate(Cells(i, 3) & "." & Format(Cells(i, 2), "00") & "." & Format(Cells(i - 1, 1), "00"))
            d2 = CDate(Cells(i - 1, 3) & "." & Format(Cells(i - 1, 2), "00") & "." & Format(Cells(i - 1, 1), "00"))
            If Abs(DateDiff("d", d2, d1)) < 7 Then
                Rows(i).Delete
                i = i - 1
            End If
        End If
    Loop
End Sub


Кстати, там у Вас в примере ошибка.
 
Hugo, спасибо огромное!)))
Все работает!!)))))
Цитата
Hugo пишет:
Кстати, там у Вас в примере ошибка.
Да, я заметил) Но главное, что смысл понятен)))
Еще раз спасибо!
 
Подскажите, как решить данную задачу через макрос, иметься группа данных в которых присутствуют пустые ячеки и пустые строки, мне необходимо удалить исключительно пустые строки.
Скрытый текст
Изменено: romkq - 11.08.2018 00:37:21
 
Пример сделал.
Изменено: romkq - 10.08.2018 15:43:47
 
Код
Sub Macro1()
Dim LastRow As Long, i As Long
    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Application.ScreenUpdating = False
    For i = LastRow To 2 Step -1
        If Application.WorksheetFunction.CountA(Range(Cells(i, 1), Cells(i, 5))) = 0 Then Rows(i).Delete
    Next
    Application.ScreenUpdating = True
End Sub



Страницы: 1
Наверх