Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Удалить строки по условию - Страница 3 - Мир MS Excel

Старая форма входа
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить строки по условию (Макросы/Sub)
Удалить строки по условию
Hugo Дата: Вторник, 19.01.2016, 22:00 | Сообщение № 41
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
А можете файл приложить?

Зачем файл? Просто подгоните код под свой формат даты - на работе у меня первая версия работала, дома такая работет:
[vba]
Код
Sub del()
    Dim rng As Range, cmp As Date
   cmp = DateValue("01. " & Format(Date, "mm.yy"))
    With Worksheets("1").Range("B:B")
        Set rng = .Find(cmp, , LookIn:=xlFormulas, lookat:=xlWhole)
        If Not rng Is Nothing Then
            Do
                rng.EntireRow.Delete
                Set rng = .FindNext()
            Loop While Not rng Is Nothing
        End If
    End With
End Sub
[/vba]
Возможно это универсальный вариант...

P.S. Если в рабочем файле удаляться будет не одна строка, и если есть формулы, завязанные на строки этого диапазона- нужно на время процесса отключать пересчёт формул и обновление экрана.


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 19.01.2016, 22:16
 
Ответить
Сообщение
А можете файл приложить?

Зачем файл? Просто подгоните код под свой формат даты - на работе у меня первая версия работала, дома такая работет:
[vba]
Код
Sub del()
    Dim rng As Range, cmp As Date
   cmp = DateValue("01. " & Format(Date, "mm.yy"))
    With Worksheets("1").Range("B:B")
        Set rng = .Find(cmp, , LookIn:=xlFormulas, lookat:=xlWhole)
        If Not rng Is Nothing Then
            Do
                rng.EntireRow.Delete
                Set rng = .FindNext()
            Loop While Not rng Is Nothing
        End If
    End With
End Sub
[/vba]
Возможно это универсальный вариант...

P.S. Если в рабочем файле удаляться будет не одна строка, и если есть формулы, завязанные на строки этого диапазона- нужно на время процесса отключать пересчёт формул и обновление экрана.

Автор - Hugo
Дата добавления - 19.01.2016 в 22:00
Wasilich Дата: Вторник, 19.01.2016, 22:59 | Сообщение № 42
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Ну тогда для 2003
Да я же уже согласился и даже сам проверял. :)
Просто,раньше не приходилось работать с таким к-вом строк.
 
Ответить
Сообщение
Ну тогда для 2003
Да я же уже согласился и даже сам проверял. :)
Просто,раньше не приходилось работать с таким к-вом строк.

Автор - Wasilich
Дата добавления - 19.01.2016 в 22:59
pabchek Дата: Четверг, 21.01.2016, 14:55 | Сообщение № 43
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
Даже удивлен, что "такой простой вопрос" вылился в целую дискуссию. :D
Для своих 457 тыс. строк применил код
[vba]
Код
Sub Макрос1()
S = Range("A" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("$A:$O").AutoFilter Field:=12, Operator:=xlFilterValues, Criteria2:=Array(1, "1/1/2016")
    ActiveSheet.Range("$A:$O").AutoFilter Field:=8, Criteria1:=Array("АА", "ББ", "ВВ"), Operator:=xlFilterValues
    ActiveSheet.Range("A2:A" & S).SpecialCells(xlCellTypeVisible).EntireRow.Delete xlUp
    ActiveSheet.ShowAllData
End Sub
[/vba]
На сортированном по дате списке работает 2 сек.
На специально перемешанном - 9 сек
Посему Василичу жирный +


"Учиться, учиться и еще раз учиться!"
WM: R399923528092


Сообщение отредактировал pabchek - Четверг, 21.01.2016, 14:58
 
Ответить
СообщениеДаже удивлен, что "такой простой вопрос" вылился в целую дискуссию. :D
Для своих 457 тыс. строк применил код
[vba]
Код
Sub Макрос1()
S = Range("A" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("$A:$O").AutoFilter Field:=12, Operator:=xlFilterValues, Criteria2:=Array(1, "1/1/2016")
    ActiveSheet.Range("$A:$O").AutoFilter Field:=8, Criteria1:=Array("АА", "ББ", "ВВ"), Operator:=xlFilterValues
    ActiveSheet.Range("A2:A" & S).SpecialCells(xlCellTypeVisible).EntireRow.Delete xlUp
    ActiveSheet.ShowAllData
End Sub
[/vba]
На сортированном по дате списке работает 2 сек.
На специально перемешанном - 9 сек
Посему Василичу жирный +

Автор - pabchek
Дата добавления - 21.01.2016 в 14:55
_Boroda_ Дата: Четверг, 21.01.2016, 15:01 | Сообщение № 44
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
После применения фильтра в макросе и перед удалением сколько было несвязанных диапазонов? Не больше 8192-х? Тогда да, все нормально. А вот если бы было больше, то таки ой.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПосле применения фильтра в макросе и перед удалением сколько было несвязанных диапазонов? Не больше 8192-х? Тогда да, все нормально. А вот если бы было больше, то таки ой.

Автор - _Boroda_
Дата добавления - 21.01.2016 в 15:01
pabchek Дата: Четверг, 21.01.2016, 15:19 | Сообщение № 45
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
Да, у меня было 3,5 тыс. отдельностей. Сделал 40 и.... На 5-й минуте прервал))))


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеДа, у меня было 3,5 тыс. отдельностей. Сделал 40 и.... На 5-й минуте прервал))))

Автор - pabchek
Дата добавления - 21.01.2016 в 15:19
_Boroda_ Дата: Четверг, 21.01.2016, 15:28 | Сообщение № 46
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
На 5-й минуте прервал

Дело не в скорости. Дело в том, что просто неверно отработает.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
На 5-й минуте прервал

Дело не в скорости. Дело в том, что просто неверно отработает.

Автор - _Boroda_
Дата добавления - 21.01.2016 в 15:28
pabchek Дата: Четверг, 21.01.2016, 15:36 | Сообщение № 47
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
неверно отработает

Да, это я понял. В принципе представить реально получаемые данные в таком перемешанном виде сложно. Но, от греха, добавляю предварительную сортировку.


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
Сообщение
неверно отработает

Да, это я понял. В принципе представить реально получаемые данные в таком перемешанном виде сложно. Но, от греха, добавляю предварительную сортировку.

Автор - pabchek
Дата добавления - 21.01.2016 в 15:36
pabchek Дата: Вторник, 02.02.2016, 18:13 | Сообщение № 48
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
С поиском дат вообще геморой...

Для себя нашел решение, как мне кажется, универсальное, т.е. если есть необходимость отфильтровать по колонке содержащей дату и не хочется запариваться с подгонкой формата:
[vba]
Код
Sub month_del()
    mnth = CDate(Sheets("Лист1").Range("A1")) 'задаем дату для фильтра
    S = Sheets("Лист2").Range("A" & Rows.Count).End(xlUp).Row
    If Sheets("Лист1").Range("A1") = 0 Then Exit Sub 'На всякий случай, если забыл указать дату
    Sheets("Лист2").Select
    Range("$A:$N").AutoFilter Field:=3, Criteria1:=mnth 'Допустим 3-я колонка содержит даты для фильтра
        ActiveSheet.Range("A2:A" & S).SpecialCells(xlCellTypeVisible).EntireRow.Delete xlUp
    ActiveSheet.ShowAllData
End Sub
[/vba]
[p.s.]не стал здесь прописывать сортировку, принял это как обязательную данность


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
Сообщение
С поиском дат вообще геморой...

Для себя нашел решение, как мне кажется, универсальное, т.е. если есть необходимость отфильтровать по колонке содержащей дату и не хочется запариваться с подгонкой формата:
[vba]
Код
Sub month_del()
    mnth = CDate(Sheets("Лист1").Range("A1")) 'задаем дату для фильтра
    S = Sheets("Лист2").Range("A" & Rows.Count).End(xlUp).Row
    If Sheets("Лист1").Range("A1") = 0 Then Exit Sub 'На всякий случай, если забыл указать дату
    Sheets("Лист2").Select
    Range("$A:$N").AutoFilter Field:=3, Criteria1:=mnth 'Допустим 3-я колонка содержит даты для фильтра
        ActiveSheet.Range("A2:A" & S).SpecialCells(xlCellTypeVisible).EntireRow.Delete xlUp
    ActiveSheet.ShowAllData
End Sub
[/vba]
[p.s.]не стал здесь прописывать сортировку, принял это как обязательную данность

Автор - pabchek
Дата добавления - 02.02.2016 в 18:13
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить строки по условию (Макросы/Sub)
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!