У меня есть большая таблица с примерно 100 тысячами строк и 40 столбцами. Мне нужно скопировать некоторые строки в другую книгу на основе условия. Мое условие состоит из массива со строками, которые соответствуют значениям столбца. Примерно так:
cond_list = ["value1", "value2", "value3" ...]
И это условие может соответствовать 5 000 строк или более
Сначала я попробовал простое решение - просто использовать Автофильтр, а затем скопировать видимые ячейки, например:
' Filter source data
src_wks.ListObjects("Table1").Range.AutoFilter _
Field:=src_wks.ListObjects("Table1").ListColumns("Column1").Index, _
Criteria1:=cond_list, Operator:=xlFilterValues
' Copy and paste
src_wks.UsedRange.SpecialCells(xlCellTypeVisible).Copy
dst_wks.Range("A1").PasteSpecial Paste:=xlPasteValues
Фильтрация занимает доли секунды, но затем в этой строке висит код:
src_wks.UsedRange.SpecialCells(xlCellTypeVisible).Copy
Выполнение этой строки занимает более 10 минут. Я должен запустить этот код примерно 20 раз, поэтому он неприемлем.
Я пытался изменить код, следуя этому комментарию: { ссылка }
Я пытался скопировать весь сначала данные, а затем удалите скрытые строки. Например:
' Copy and Paste whole table
dst_wks.UsedRange.Offset(1, 0).Value = ""
addr = src_wks.UsedRange.Address
dst_wks.Range(addr).Value = src_wks.UsedRange.Value
' Filter data
dst_wks.ListObjects("Table1").Range.AutoFilter _
Field:=dst_wks.ListObjects("Table1").ListColumns("Column1").Index, _
Criteria1:=cond_list, Operator:=xlFilterValues
' Remove rest
Application.DisplayAlerts = False ' Suppress "delete row?" promt
Dim i, numRows As Long
numRows = dst_wks.UsedRange.Rows.Count
For i = numRows To 1 Step -1
If (dst_wks.Range("A" & i).EntireRow.Hidden = True) Then
dst_wks.Range("A" & i).Delete
End If
Next i
Application.DisplayAlerts = True
Копирование целых данных занимает менее 2 секунд. Но затем он снова зависает в течение l oop и занимает более 10 минут. У меня нет идей, пожалуйста, помогите.