antonsf
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Вопрос: как в 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. Строк очень много - база данных. | | 'Подразумеваем что данные содержат только числа и текст (не даты, например) Sub ExampleRecolor(DataRange as Range) Dim RowIndex as Integer Dim ColumnIndex as Integer Dim Value as String For RowIndex = 1 To DataRange.Rows.Count For ColumnIndex = 1 To DataRange.Columns.Count Value = DataRange(RowIndex,ColumnIndex).Value Select Case Value Case "Жёлтый" 'Цвет ячейки - жёлтый DataRange(RowIndex,ColumnIndex).Interior.Color = RGB(255,255,0) 'Цвет шрифта - красный DataRange(RowIndex,ColumnIndex).Font.Color = RGB(255,0,0) End Select Next Next End Sub | Всего записей: 13 | Зарегистр. 13-04-2007 | Отправлено: 20:54 15-06-2010 | Исправлено: antonsf, 07:49 19-06-2010 |
|