Более эффективный способ удаления строк

У меня есть код, который удаляет строки, которые не указаны в указанном списке номеров строк, которые должны храниться. Он функционирует по назначению.

For lRow = numRowsInBBS To 1 Step -1 lMatch = 0 On Error Resume Next lMatch = Application.Match(lRow, ws.Range("AE4:AE" & numRows).Value, 0&) On Error GoTo 0 If Not CBool(lMatch) Then wsImport.Cells(lRow, 1).EntireRow.Delete End If Next End Sub 

Однако это занимает монументальное количество времени. Для этого на 150 строк требуется несколько минут обработки. У меня есть документы, длина которых может составлять 1000 строк.

По сути, я хочу удалить все строки на указанном листе EXCEPT для номеров строк, указанных в AE4:AE?? (Это вычисляется numRows) на другом листе.

Диапазон данных не соприкасается, AE4:AE?? может перечислить числа 3,4,5,33,66,101,110 в качестве строк для хранения. Все остальные строки должны быть удалены.

Есть ли лучший способ достичь моей цели здесь?

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

EDIT: Согласно предложению, я попробовал автофильтр:

 Dim rowsToKeep() As Variant: rowsToKeep = ws.Range("AE4:AE" & numRows) Dim allRows As Range: Set allRows = Range("ZZ1:ZZ" & numRowsInBBS) With wsImport .Range(allRows.Address).Formula = "=row()" .Range(allRows.Address).AutoFilter Field:=1, Criteria1:=rowsToKeep, Operator:=xlFilterValues .Range(allRows.Address).SpecialCells(xlCellTypeVisible).EntireRow.Delete .Range(allRows.Address).AutoFilter Field:=1 End With 

Я пытаюсь: Установить данные в диапазоне AE4:AE?? как данные для массива. Затем используйте ZZ в качестве вспомогательного столбца, содержащего номера строк. Затем отфильтруйте строки, которые я хочу сохранить. Затем удалите все видимые строки. Затем покажите строки, которые были отфильтрованы

Однако фильтр скрывает все, что подсказывает мне, что что-то не так с rowsToKeep , и да AE4:AE?? на другом листе содержит значения.

Попробуйте это ( непроверено )

Удаление строк в цикле всегда будет медленнее. Что делает следующий код, так это то, что он хранит строки, которые необходимо удалить в объекте диапазона, а затем удаляет их в конце цикла в One Go.

 Dim delRng As Range For lRow = 1 To numRowsInBBS On Error Resume Next lMatch = Application.Match(lRow, ws.Range("AE4:AE" & numRows).Value, 0&) On Error GoTo 0 If Not CBool(lMatch) Then If delRng Is Nothing Then Set delRng = wsImport.Rows(lRow) Else Set delRng = Union(delRng, wsImport.Rows(lRow)) End If End If Next If Not delRng Is Nothing Then delRng.Delete 

Использование CountIf ( CountIf )

 Dim delRng As Range For lrow = 1 To numRowsInBBS If Application.WorksheetFunction.CountIf(ws.Range("AE4:AE" & numRows), lrow) > 0 Then If delRng Is Nothing Then Set delRng = wsImport.Rows(lrow) Else Set delRng = Union(delRng, wsImport.Rows(lrow)) End If End If Next If Not delRng Is Nothing Then delRng.Delete 
Interesting Posts

Как импортировать рабочие элементы TFS со ссылками «многие-многие» из Excel

Несоответствие типа VBA по функции года как критерий CountIfs

Исключение при оценке формулы CELL с использованием Apache POI

Функция Microsoft Excel Excel Count

Выпадающие списки с условными данными

Ошибка автоматизации Excel: ошибка времени выполнения '-2147417848 (80010108)'

Линейная диаграмма в matplotlib с двойной осью (строки на оси)

Пользовательская функция Excel для извлечения данных XML

Получение текста, а не значение с помощью Delphi Ole Automation Excel

Доступ к VBA для экспорта данных на основе запроса в шаблон xlsx, который предопределен для приема экспортированных данных

Microsoft ACE OLE DB 12.0 не зарегистрирован на локальном компьютере. Но это

Сохранение данных Excel 2007 в новую презентацию PowerPoint

Формула Excel, чтобы получить номер недели в месяц (с понедельника)

как объединить столбцы при экспорте из jtable в excel? используя apache POI

Сбор данных из коллекции Excel в Excel

Давайте будем гением компьютера.