Вопрос:
как в Excel программно получить отфильтрованный список?
как в Excel программно получить результат работы автофильтра? Решение №1:
Worksheet.AutoFilter.Range.Rows.SpecialCells(xlCellType) As Range
Вроде бы очевидное решение.
Камень №1:
В данном случае мы получим только первую порцию строк диапазона, которые идут подряд и соответствуют фильтру.
Из этого делаем вывод, что где-то есть и остальные порции:
Worksheet.AutoFilter.Range.Rows.SpecialCells(xlCellType).Areas.Item(Index) As Range
Камень №2:
Вытекает из вывода предыдущего.
Rows.SpecialCells(xlCellType).Areas содержит не массив строк, а массив видимых диапазонов.
Это значит, что если в фильтруемом диапазоне есть скрытые столбцы, то
строка, соответствующая фильтру, будет разбита на несколько диапазонов:
Если в строке (допустим №1):
Столбец - A B C D E F G H
Скрыт - нет нет да нет нет да нет нет
То:
Areas.Count=3
Areas.Item(1).Address="A1:B1"
Areas.Item(2).Address="D1:EC"
Areas.Item(3).Address="G1:H1"
Прежде чем перебирать Areas построчно, надо отобразить скрытые столбцы:
Sub Example
Dim Data as Range
Dim Hidden As Collection
Set Data = ActiveSheet.Range("A1:H10")
Set Hidden = GetHiddenColumns(DataRange)
ShowColumns(Hidden)
End Sub
Sub ShowColumns(Columns As Collection)
If Columns.Count > 0 Then
Dim Index As Integer
For Index = 1 To Columns.Count
Columns(Index).EntireColumn.Hidden = False
Next
End If
End Sub
Function GetHiddenColumns(Range As Range) As Collection
Dim Index As Integer
Set GetHiddenColumns = New Collection
For Index = 1 To Range.Columns.Count
If Range.Columns(Index).EntireColumn.Hidden = True Then
GetHiddenColumns.Add Range.Columns(Index)
End If
Next Index
End Function
Вот теперь Areas будет содержать строки диапазона целиком, можно приступать к перебору.
Не забудьте, что свойство Worksheet.Autofilter будет содержать данные только если активная ячейка находится в пределах фильтруемого диапазона.
И ещё - на защищенном листе далеко не все свойства диапазона можно получить.
Добавлено: Цитата:
Цитата: Помогите, пожалуйста!
Необходимо окрашивать строки в цвета (более 10 цветов) в зависимости от текста/значения в ячейке в этих строках.
Условным форматированием не обойтись. Опишу подробнее:
если в столбце С3 в строке 1 возникает надпись "солнце", то строка окрашивается в желтый;
если в столбце С3 в строке 1 возникает надпись "небо", то строка окрашивается в синий;
и т.д.
если в столбце С3 в строке 2 возникает надпись "солнце", то строка окрашивается в желтый;
если в столбце С3 в строке 2 возникает надпись "небо", то строка окрашивается в синий;
и т.д.
Таких цветов более 10. Строк очень много - база данных.