Страницы: 1
RSS
Макрос удаления строк по заданному критерию столбца
 
Код
Sub DeleteRows()

   Dim rng As Range, value, i As Long
   Application.ScreenUpdating = False
   Set rng = Range("F2:F60000")
   For i = rng.Rows.Count To 1 Step -1
       value = rng.Cells(i, 1).value
       If (value = 0) Then
           rng.Rows(i).EntireRow.Delete
       End If
   Next i
   Application.ScreenUpdating = True
   MsgBox "Готово", vbInformation
     
End Sub
Добрый день!

Помогите, пожалуйста, разобраться. Макрос работает только на небольшой массив данных, но если указывать весь диапазон, то обработка не заканчивается.
Как возможно изменить или упростить решение?
Изменено: diyanova - 10.08.2021 07:46:11
 
Код
Sub DeleteRows()
    Application.ScreenUpdating = False
        arr = Range("F2:F60000").value
        For i = UBound(arr) To 1 Step -1
            If arr(i, 1) = 0 Then Rows(i + 1).Delete
        Next i
    Application.ScreenUpdating = True
    MsgBox "Готово!", vbInformation
End Sub
 
skais675 код не помог, проблема осталась, слишком много строк для обработки, за 15 минут так и не сработал. При этом, если ставить небольшой диапазон: Range("F2:F60"), то все работает. Возможно, каким-либо образом изменить, чтобы макрос обрабатывал 60 тыс. строк недолго по времени?

Или можно добавить в исходный код на консолидацию данных условие, чтобы данные с файлов-источников собирались при условии "если не пусто в определенном столбце, то берем данную строку из данного листа и файла в наш консолидированный отчет"?
Код
Sub svod()
    switch_off
    this_wb = ThisWorkbook.Name
        ' используется для получения имени книги, в которой код записан или хранится в модуле этой книги. Если вы пишете код в модуле или листе книги A , то Thisworkbook.name вернет A независимо от того, какая книга является activeworkbook
    
    path_ = "C:\Users\diyanovabd\Desktop\Новая папка\" ' путь к папке
    array_ = Array("2021_Производительность ГАП_ПФ.xlsx", "2021_Производительность ГПО_ПФ.xlsx", "2021_Производительность ГПХ_ПФ.xlsx") ' массив данных в папке
        
    str_ = 2 ' начинаем со строки 2
    For Each file_ In array_ ' для каждого файла в массиве
    open_wb_path = path_ & file_ ' путь к файлу
    
    Workbooks.Open Filename:=open_wb_path, UpdateLinks:=False, Local:=True ' Workbooks.Open Filename:= "Название файла, который находится в папке, путь к которой указан выше"
  
        For i = 1 To Workbooks(file_).Sheets.Count
            If Workbooks(file_).Sheets(i).Range("D1").Value = "ФИО менеджера:" Then 'Выбор листов с ФИО менеджера
                
                Workbooks(this_wb).Sheets("СМБ").Range("A" & str_ & ":A" & str_ + 1499).Value = _
                    file_ 'Файл
                
                Workbooks(this_wb).Sheets("СМБ").Range("B" & str_ & ":B" & str_ + 1499).Value = _
                    Workbooks(file_).Sheets(i).Range("A4:A1503").Value 'Менеджер
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("C" & str_ & ":C" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("E4:E1503").Value 'ИНН
                
                    Workbooks(this_wb).Sheets("СМБ").Range("D" & str_ & ":D" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("G4:G1503").Value 'Клиент
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("E" & str_ & ":E" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("F4:F1503").Value 'ЛС
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("F" & str_ & ":F" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("D4:D1503").Value 'Продукт
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("G" & str_ & ":G" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("L4:L1503").Value 'Дата активации
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("H" & str_ & ":H" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("M4:M1503").Value 'Статус
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("I" & str_ & ":I" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("J4:J1503").Value 'Кол-во услуг, шт.
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("J" & str_ & ":J" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("K4:K1503").Value 'Ежемес
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("K" & str_ & ":K" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("P4:P1503").Value 'Инсталл
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("L" & str_ & ":L" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("N4:N1503").Value 'Оборудование, шт.
                    
                    Workbooks(this_wb).Sheets("СМБ").Range("M" & str_ & ":M" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("O4:O1503").Value 'Выручка оборудование
                
                    Workbooks(this_wb).Sheets("СМБ").Range("N" & str_ & ":N" & str_ + 1499).Value = _
                Workbooks(file_).Sheets(i).Range("Q4:Q1503").Value 'Комментарий

                
                str_ = str_ + 1499
            End If
        Next i
        
    Workbooks(file_).Close
    Next file_
    switch_on

End Sub
 
Цитата
diyanova: ...чтобы макрос обрабатывал 60 тыс. строк недолго по времени?
скиньте ссылку на файл без конфиденциальных данных - разберёмся
Вообще самый быстрый способ удаления строк - отсортировать перед удалением, чтобы все удаляемые строки шли подряд
Изменено: Jack Famous - 10.08.2021 10:37:07
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
diyanova написал: ...чтобы макрос обрабатывал 60 тыс. строк недолго по времени?
считать в массив и выгрузить только нужное, не трогать Rows.Delete книги excel (а предварительно просто удалить всё с листа)
p.s.
макрос от skais675 мало того, что удаляет строки поштучно, так ещё и на каждом удалении делает проверку if - поэтому долго...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi: считать в массив и выгрузить только нужное
если так можно в рамках задачи, то да - это самое простое и быстрое, но обычно таблица должна измениться, а не появиться новая
Цитата
JeyCi: макрос от skais675 мало того, что удаляет строки поштучно, так ещё и на каждом удалении делает проверку if - поэтому долго...
а вы, видимо НИ РАЗУ не тестили проверку типа If arr(r,1)=0, иначе бы знали, что временем такой проверки легко можно пренебречь. Это проверяется элемент МАССИВА, если что (не ячейка) …
Удалять по одной - надёжно (вот случайно обнаруженный косяк со вставкой НЕ по одной, например), к тому же собирать в диапазон и удалять одним махом далеко не всегда быстрее
Изменено: Jack Famous - 10.08.2021 09:51:04
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ссылка на консолидированный пример отчета и папку-источник:

https://fex.net/ru/s/94fplt7

 
Не знаю, что у вас висит, но этот код в файле Пример на моем старом железе работает 43 сек
Код
Sub qq()
    t = Timer
    Application.ScreenUpdating = False
    lr = Cells(Rows.Count, "F").End(xlUp).Row + 1
    Rows(lr & ":1048576").Delete
    arr = Range(Cells(1, "F"), Cells(lr, "F")).Value
    For i = UBound(arr) To 1 Step -1
        If Len(arr(i, 1)) = 0 Then Rows(i).Delete
'        If i Mod 1000 = 0 Then Debug.Print i
    Next
    Debug.Print "ИТОГО " & Format(Timer - t, "00000")
    Application.ScreenUpdating = True
End Sub
ИТОГО 43
 
В примере код с зануленными данными для примера, содержит несколько строк. Фактически 6 файлов источников по 10-15 листов в каждом, итого на выходе 60 000 полузаполненных строк получается. Маленький код работает нормально, об этом и речь, как изменить/расширить на большой объем обработки.
 
diyanova, для файла "Пример" (непонятно, зачем ещё папку скидывать было):
Большинство известных (и не очень) вариантов
на "реальных" данных (удаление 25 тыс строк) время работы от 0,1 сек на всё про всё

Цитата
diyanova: 6 файлов по 10-15 листов, итого 60 000 полузаполненных строк
потестируйте мои варианты на самом большом списке (или сделайте такой) и, какой быстрее всех окажется, скажите — надо будет переделать этот вариант в функцию, которую вы запустите в цикле по файлам/листам
Изменено: Jack Famous - 10.08.2021 14:56:04
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous спасибо вам большое!
 
diyanova, большое пожалуйста)
я дополнил выше про вашу исходную задачу - гляньте и ответьте
Изменено: Jack Famous - 10.08.2021 14:58:35
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх