Новости:

Теперь на форум можно залогиниться / зарегистрироваться с помощью ВКонтакте. Уже существующие пользователи могут связать свою учетную запись с аккаунтом ВКонтакте одним кликом в профиле пользователя http://forum.msexcel.ru/index.php?action=profile;area=account

Главное меню

Удаление строки, с определенным значением в ячейке.

Автор Demitius, 01.02.2011, 11:07

« назад - далее »

Demitius

Добрый день!
Прошерстив форум, к сожалению так и не смог подобрать оптимального макроса для:
Удаления лишних строк с одинаковым значением (около 100-200)

Итак дабы не путать людей расскажу в чем соль:

Есть Файл соответствий артикулов компаний основанный на "ВПР"
При вставке требуемых артикулов, через кнопочку макрос создает новый необходимый мне файл где остаются только требуемые мне данные из двух столбцов.

Но так как функция ВПР на ненайденные артикулы выдает значение #Н/Д, мне необходимо удалить все строки с этим значенимем.

Прошерстил несколько формул, но к сожалению переделать под текущий случай неполучилось.

Если у кого есть возможность поделится инфой о таком макросе, буду премногоблагодарен.

Poltava

Не знаю насколько смогу вам помочь на роль эксперта да и пожалуй вобще человека мало мальски в этом разбирающегося не претендую но мот хоть и глупый совет но дам а там сами судите вот пример макроса который умеет удалять строки стабатывает при активизатции листа как удалить ячейки именно с ошибкой не знаю но можно воспользоваться функцией ЕСЛИОШИБКА и пусть возвращает 0 а строки с 0 удаляет макрос ниже

Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False ' отключаем обновление экрана
    Dim i As Range
        Set RowBlank = [B8:B18] 'задаем диапазон в котором отслежываем ячейки
        For Each i In RowBlank
            If i = 0 Then i.EntireRow.Delete 'Задаем условие в каком случае удалить
        Next
    Application.ScreenUpdating = True
End Sub
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Poltava

о вот наткнулся http://msoffice.nm.ru/faq/macros/range2_2.htm попробуйте в качестве условия для удаления поставить одно из тех что по ссылке может поможет если будет время чуть позже попробую переделать чтоб реагировало на значения с ошибкой
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Demitius

Спасибо большое, завтра обязательно попробую.

Но сейчас есть мнение: при переносе строк в новый файл, значение #Н/Д уже в принципе не ошибка а просто набор букв,
так как мой макрос при создании нового файла копирует только значения строк.


Poltava

ну так тем более сравнивайте не с нулем а с заданным текстом и будет вам счастье
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

_Boroda_

Уважаемый Poltava. К сожалению, Ваш макрос работать будет не корректно.
Давайте представим себе, что в диапазоне В8:В18 у нас нули в ячейках В8 и В9, а в В10 значение 22222. Тогда, следуя Вашему коду, последовательность действий будет такая: 1). i=B8, поскольку В8=0, то удаляем строку 8 и строка, которая была под номером 9 становится строкой 8, а десятая строка становится девятой;
2). i=В9, в В9 у нас сейчас не 0, как было до удаления восьмой строки, а 22222 из ячейки, которая была В10, а сейчас стала В9. Ее не удаляем. И так далее.
И все бы хорошо, но ноль, который сначала был в В9, а после удаления строки 8 стал в В8, так и остался.

Такие макросы нужно писать с циклом от конца диапазона к началу (то есть For i = 18 to 8 step = -1). Но, если объем проверяемых данных велик, то такой цикл займет довольно много времени. Я такие вещи делаю вообще без цикла. Если Demitius приложит свой файл, то с удовольствием покажу как.
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Demitius

Добрый день "Борода" !

Действительно так и есть, строки при удалении могут менятся. Файл прилагаю но к сожалению всё не так просто, Н/Д может действительно вылезти в любом месте столбца А.

Простенький Файл прилагаю.

Poltava

Спасибо за разъяснение как писал выше на роль эксперта не претендую так что прошу не обижаться я сразу предупреждал
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

_Boroda_

Вроде так работает

Sub Макрос1()
r_ = Range("A1").End(xlDown).Row
Range("A1:A" & r_).Replace What:="#", Replacement:="///#"
    Range("A1:A" & r_).AutoFilter
    ActiveSheet.Range("$A$1:$A$94").AutoFilter Field:=1, Criteria1:="///#N/A"
    Range("A2:A" & r_).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    Selection.AutoFilter
End Sub
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Demitius

Спасибо большое! Работает, да еще так как нужно!
Пойду присобачу его на место, и будет мне счастье.

Poltava

Здрасте помогите разобраться
попытался применить ваш код к себе дабы удалить все строки с буквой У хотя посути нужно наобород те в которых нет буквы У но это пол беды я применить попытался но в ответ тишина подскажите что я делаю не так нужно удалить все строки в диапазоне AQ8:AQ80 не равные У при условии появления в строке AQ7 букв "CL" пытаюсь вставить ваш код не в модуль а непосредственно в лист между Private Sub Worksheet_Change(ByVal Target As Range) но что то нет эффекта вообще при вставке в модуль и запуске вручную какието изменения есть чтото удаляеться но явно не то что НУЖНО вот собственно код

   r_ = Range("AQ8").End(xlDown).Row
   Range("AQ8:AQ" & r_).Replace What:="У", Replacement:="///У"
       Range("AQ8:AQ" & r_).AutoFilter
       ActiveSheet.Range("$AQ$8:$AQ$80").AutoFilter Field:=1, Criteria1:="///У" 'And "///Y"
       Range("AP8:AP" & r_).SpecialCells(xlCellTypeVisible).EntireRow.Delete
       Selection.AutoFilter

ниже файл на всякий случай

либо в моем случае лучше циклом с шагом -1
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

_Boroda_

В предыдущем макросе первые две строки написаны исключитеьно для того, чтобы избавиться от #Н/Д и преобразовать его в текст. Так что в Вашем случае макрос будет таким:
Range("AQ7:AQ80").AutoFilter
        Range("$AQ$8:$AQ$80").AutoFilter Field:=1, Criteria1:="<>У", Operator:=xlAnd, Criteria2:="<>Y"
        Range("Aq8:Aq80").SpecialCells(xlCellTypeVisible).EntireRow.Delete
        Selection.AutoFilter

Да, забыл еще уточнить, условие работы - отсутствие на листе автфильтра.
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Poltava

ЗАРАБОТАЛО огромное спасибо  :D ну и +1 конечноже
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.