Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel 2007. Как программно узнать количество строк автофильтра? / 7 сообщений из 7, страница 1 из 1
13.10.2009, 12:01
    #36247598
anton-sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
Всем привет.
Есть таблица (прайс-лист).
В первом столбце юзер отмечает нужные позиии.
Например для печати или создания ценников.
Чтобы не перебирать весь прайс на эти отметки (for/next), есть автофильтр:

Dim table As ListOobject
Set table = Workbook("прайс.xlsm").Worksheets("прайс").ListObjects("тбл_прайс")
table.Range.AutoFilter 1,"<>"

Теперь вопрос - как узнать количество строк автофильтра?
То бишь отфильтрованных строк.

Я пробовал это:

table.AutoFilter.Range.Rows.Count

Но такой вариант почему-то выдаёт общее количество строк в таблице.

Хелм ми :)
...
Рейтинг: 0 / 0
13.10.2009, 12:03
    #36247603
anton-sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
Опс, са себе и отвечаю:

table.AutoFilter.Range.ListObject.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Count

Сорри за оффтоп, но, вдруг кому-то понадобиться :)
...
Рейтинг: 0 / 0
18.10.2009, 16:43
    #36257946
anton-sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
Ещё вариант.

Дано:
Книга = "прайс.xlsm"
Лист = "прайс"
Таблица = "тбл_Прайс"
Столбцы = {1: "Метка", 2: "Наименование", 3: "Цена"}

Задача:
Программно получить количество отмеченных позиций в столбце "Метка" используя автофильтр.

Решение:
Public Function TableAutoFilter_RowsCount(ByVal field As Long) As Long
Dim table As ListObject

Application.ScreenUpdating = False
Set table = Workbook("прайс.xlsm").Worksheets("прайс").ListObjects("тбл_Прайс")
table.Range.AutoFilter field, "<>"
TableAutoFilter_RowsCount = table.DataBodyRange.SpecialCells(xlCellTypeVisible).Areas.Count
table.Range.AutoFilter.ShowAllData
Application.ScreenUpdating = True
End Function

...
Dim rows As Long
rows = TableAutoFilter_RowsCount(1)
...
...
Рейтинг: 0 / 0
18.10.2009, 17:24
    #36258005
anton-sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
Забыл упомянуть, что доступ именно к отфильтрованным данным получается только при включенной фильтрации и только через table.DataBodyRange. SpecialCells(xlCellTypeVisible).Areas

Пример:

Дано:
Книга = "прайс.xlsm"
Лист = "прайс"
Таблица = "тбл_Прайс"
Столбцы = {1: "Метка", 2: "Наименование", 3: "Цена"}

Задача:
Программно отфильтровать таблицу по столбцу "Метка"
Программно получить все значения строк столбца "Наименование" в отфильтрованной таблице

Решение:
...
Dim table As Long
Dim index As Long
Dim rows As Long
Dim column As Long
Dim value As String

Set table = Workbook("прайс.xlsm").Worksheets("прайс").ListObjects("тбл_Прайс")
column = table.ListColumns("Метка").Index
Application.ScreenUpdating = False
table.Range.AutoFilter column, "<>"
rows = table.DataBodyRange.SpecialCells(xlCellTypeVisible).Areas.Count
If rows > 0 Then
column = table.ListColumns("Наименование").Index
For index = 1 To rows
value = table.ListColumns(column).Range(table.DataBodyRange.SpecialCells(xlCellTypeVisible).Areas(index).row).Value
'--- что-то делаем с полученными данными ---
Next index
End If
Application.ScreenUpdating = True
...
...
Рейтинг: 0 / 0
18.10.2009, 17:32
    #36258020
anton-sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
В последнем примере закралась позорная ошибка:
Dim table As Long
надо заменить на
Dim table As ListObject
...
Рейтинг: 0 / 0
18.10.2009, 18:23
    #36258082
anton-sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
Мммм, ещё проблема нарисовалась:
Areas содержит не строки, а диапазон строк!
Т.е. если у вас отфильтрованные строки имеют, например, такую нумерацию:
10
11
12
100
101
102
2000
2001
2002
то Areas возвращает значение 3, хотя строк 9!
Тут можно пробегать циклом по каждому Areas , благо Areas наследует Region .

Но мне это не очень нравиться.
Какое-то запутанное наследование в Office.
Что-же, буду ковырять дальше...
...
Рейтинг: 0 / 0
18.10.2009, 23:10
    #36258370
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel 2007. Как программно узнать количество строк автофильтра?
Debug.Print table.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel 2007. Как программно узнать количество строк автофильтра? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]