У меня есть книга Excel с 250 000 строк и 10 столбцов, и я хочу разделить данные на разные книги.Моя идея состояла в том, чтобы отфильтровать список, чтобы Excel / VBA не проходил все 250 000 строк каждый раз, когда мой код говорит что-то искать в данных.
Однако я столкнулся с одной конкретной проблемой с Sort
, а также с общим вопросом о скрытых строках и SpecialCells(xlCellTypeVisible)
.Во-первых, вот код:
Option Explicit
Sub Filtering()
Dim wsData As Worksheet
Dim cell As Variant
Dim lRowData As Long, lColData As Long
'filter
Set wsData = ThisWorkbook.Sheets(1)
lRowData = wsData.Cells(Rows.Count, 1).End(xlUp).Row
wsData.Range("A:A").AutoFilter Field:=1, Criteria1:="Name1"
For Each cell In wsData.Range(wsData.Cells(2, 1), wsData.Cells(100, 1)).SpecialCells(xlCellTypeVisible)
Debug.Print cell.Value
Next cell
'sort
lColData = wsData.Cells(1, Columns.Count).End(xlToLeft).Column
wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRowData, lColData)).SpecialCells(xlCellTypeVisible).Sort Key1:=wsData.Range("B1:B100"), Order1:=xlDescending, Header:=xlYes ' returns error because of SpecialCells
End Sub
- «Ошибка времени выполнения« 1004 »: это невозможно сделать при выборе нескольких диапазонов. Выберите один диапазон и повторите попытку».Это происходит в последней строке, в
wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRowData, lColData)).SpecialCells(xlCellTypeVisible).Sort Key1:=wsData.Range("B1:B100"), Order1:=xlDescending, Header:=xlYes
.Это происходит только тогда, когда я использую SpecialCells(xlCellTypeVisible)
, поэтому wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRowData, lColData)).Sort Key1:=wsData.Range("B1:B100"), Order1:=xlDescending, Header:=xlYes
работает.
Я думал об использовании SpecialCells(xlCellTypeVisible)
, что только тогда VBA пропустит отфильтрованные ячейки.Я попробовал это, однако, и мне кажется, что .Sort
пропускает их в любом случае, с * 1017 или без * - кто-то может это подтвердить?
И это приводит к моему более общему вопросу: мне не совсем ясно, когда Excel / VBA пропускает отфильтрованные строки, а когда нет.Чтобы перебрать видимые ячейки, мне нужно использовать
SpecialCells(xlCellTypeVisible)
.С
.Sort
я (может быть) не?И этот вопрос всегда будет всплывать при любой операции, которую я буду выполнять в этих отфильтрованных списках.
Это заставило меня задуматься: работать ли мне с исходным листом, где часть данных скрыта, или временно создавать новый лист, копировать только те данные, которые мне нужны (= исключая строки I 'спрятал с фильтром) а потом работать с этим?Будет ли этот новый лист быстрее или проще?Что лучше в вашем опыте?