7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
1

Как отфильтровать уже отфильтрованные значения таблице Excel

15.04.2013, 14:41. Показов 10624. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
С помошью команды:
Visual Basic
1
Workbooks("file.xls").Worksheets("Sheet1").UsedRange.AutoFilter Field:=1, Criteria1:=filter, Operator:=xlFilterValues
автоматически отфильтровал по первому полю таблицу с данными (UsedRange) по значению из массива filter.

А теперь как мне из этого отфильтрованного объема данных отфильтровать дополнительно но уже по другому полю (например №2)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2013, 14:41
Ответы с готовыми решениями:

Как отфильтровать подстановочные значения в таблице по значению предыдущего столбца
Подскажите, пожалуйста! Есть таблица БД в которой значения трёх первых столбцов вводятся...

Как подсчитать отфильтрованные записи в таблице?
Вопрос простенький, как подсчитать отфильтрованные записи в таблице

Как суммировать только отфильтрованные значения
Добрый день, Скажите, пожалуйста, как заставить excel считать сумму только тех ячеек, которые...

Как исключить из Comboboxa значения, которые уже были введены в ячейки Excel?
Вот, допустим, я ввожу данные в 4-х combobox'ax, после ввода нажатием кнопки, каждый combobox...

42
15137 / 6411 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
15.04.2013, 15:02 2
... Field:=2, ...
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
16.04.2013, 13:16  [ТС] 3
Не верно выразился. Поправка.
Как узнать список (к примеру по колонке №2) отфильтрованных значений который отфильтровался?

Т.е. таблица отфильтрована теперь как получить доступ к этим данным.
0
15137 / 6411 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
16.04.2013, 13:38 4
Отфильтрованные ячейки - это видимые ячейки. Диапазон, включая заголовок, можно получить так:
Visual Basic
1
set rng=Workbooks("file.xls").Worksheets("Sheet1").autofilter.range.columns(2).specialcells(xlcelltypevisible)
Или перебирать все ячейки из .columns(2) и проверять свойство .entirerow.hidden.
1
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
16.04.2013, 14:53  [ТС] 5
Не совсем понял, в итоге rng это будет объект Range ?
0
15137 / 6411 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
16.04.2013, 14:58 6
Да, объект Range.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
17.04.2013, 05:59  [ТС] 7
Цитата Сообщение от Казанский Посмотреть сообщение
Отфильтрованные ячейки - это видимые ячейки. Диапазон, включая заголовок, можно получить так:
Visual Basic
1
set rng=Workbooks("file.xls").Worksheets("Sheet1").autofilter.range.columns(2).specialcells(xlcelltypevisible)
Или перебирать все ячейки из .columns(2) и проверять свойство .entirerow.hidden.
Хорошо, первый предложенный способ предпочтительнее т.к. вариант с перебором всех ячеек не годится, т.к. ячеек может быть миллионы.

Казанский, а существует ли способ получить объект Range всех отфильтрованных значений а не только какой то отдельной колонки отфильтрованных значений?

Например ведь существует объект UsedRange который возвращает диапазон с данными начиная от верхней левой до нижней правой ячейки в листе...
0
15137 / 6411 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
17.04.2013, 09:30 8
Цитата Сообщение от oleggy Посмотреть сообщение
существует ли способ получить объект Range всех отфильтрованных значений
Конечно Из предыдущего выражения уберите .columns(2) - получите весь диапазон.
2
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
18.04.2013, 12:55  [ТС] 9
Спасибо. Подскажите.
Не могу узнать как определить кол-во строк и столбцов в у этой отфильтрованной области?

Добавлено через 55 минут
rng.Rows.Count возвращает 1.
Не могу понять.
А должен возращать кол-во строк включая заголовок.
к примеру
rng.Count возвращает корректное значение, кол-во всех элементов в области.
0
15137 / 6411 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
18.04.2013, 13:16 10
Надо перебрать все области
Visual Basic
1
2
3
For Each a In rng.Areas
    nRows = nRows + a.Rows.Count
Next
1
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
18.04.2013, 14:13  [ТС] 11
Правильно ли я понял, что список отфильтрованных значений представляется в фильтре как множество Areas?
А каждая Areas это область из соседних непрерывных ячеек?
Т.е. команда rng.Rows.Count возвращает кол-во строк в первой Areas и которая (в моем случае) равна 1.
Так?

Просто мне непонятно почему rng.Count возвращает верное кол-во отфильтрованных ячеек.
ведь rng мы задавали как диапазон ячеек по колонке №2 из отфильтрованной таблицы.

Это я к чему, пытался прочитать все эти значения вот так:
Visual Basic
1
2
3
For i = 2 To rng.Count    
  curr = rng(i).Value
Next
Но обнаружил что rng(1) - это 1-я ячейка в области нефильтрованных значений, rng(2) - 2-я ячейка и т.д...

Как же так?
rng.Count возвращает верное кол-во отфильтрованных (отображаемых ячеек)
А rng(1) - возвращает значение неотображаемой первой ячейки нефильтрованной области..
0
15137 / 6411 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
18.04.2013, 14:26 12
Выражение rng(i), т.е. свойство rng.Cells(i), работает не так, как Вам хотелось бы
Грубо говоря, это свойство возвращает ячейку ЛИСТА относительно первой ячейки rng. Для него неважно, входит эта ячейка в rng или нет. Чтобы перебрать все ячейки несвязного диапазона, можно использовать цикл
Visual Basic
1
2
3
for each oneCell in rng
 
next
1
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
19.04.2013, 06:10  [ТС] 13
Казанский, а ты случаемне в курсе как можно считать значения из списка фильтра?
Имеется ввиду что значения были отфильтрованы, теперь как узнать список этих отфильтрованных значений как представляет их сам Excel в фильтре..
Миниатюры
Как отфильтровать уже отфильтрованные значения таблице Excel  
0
5471 / 1149 / 50
Регистрация: 15.09.2012
Сообщений: 3,515
19.04.2013, 09:08 14
Код работает, если на активном листе есть автофильтр.

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Sub Procedure_1()
    
    Dim mySheet As Excel.Worksheet
    Dim myAutFilter As Excel.AutoFilter
    Dim mySingleFilter As Excel.Filter
    Dim myArray() As Variant
    Dim i As Long
    
    '1. Даём VBA-имя "mySheet" активному листу для удобства написания кода:
        'когда будем ставить точку, то будет появляться список членов.
    Set mySheet = ActiveSheet
    
    '2. Даём VBA-имя автофильтру, который есть на активном листе.
    Set myAutFilter = mySheet.AutoFilter
    
    '3. Автофильтр состоит из нескольких столбцов Excel-листа.
    'Входит столбец в автофильтр или нет, можно посмотреть
        'по наличие кнопки-стрелки в столбце.
    'Дадим VBA-имя "mySingleFilter" первому столбцу в автофильтре.
    Set mySingleFilter = myAutFilter.Filters(1)
    
    '4. Смотрим, выбирал ли пользователь чего-нибудь.
    If mySingleFilter.On = False Then
        'Если ничего не выбирал.
        'Выводим результат в View - Immediate Window.
        Debug.Print "Пользователь ничего не выбрал."
        'Выходим из процедуры.
        Exit Sub
    End If
    
    '5. Выводим параметры фильтра.
    
    'Узнаём, сколько пунктов выбрано в фильтре
        '(это флажки в программе "Excel" в автофильтре).
    
    '5.1. Если выбран один флажок, то данные берутся из свойства "Criteria1".
        'Параметр "Criteria2" не существует.
    If mySingleFilter.Count = 1 Then
        Debug.Print mySingleFilter.Criteria1
    '5.2. Если выбрано два флажка, то данные берутся
        'из свойств "Criteria1" и "Criteria2".
    ElseIf mySingleFilter.Count > 0 And mySingleFilter.Count < 3 Then
    
        Debug.Print mySingleFilter.Criteria1
        Debug.Print mySingleFilter.Criteria2
        
    '5.3. Если выбрано более двух флажков, то "Criteria1" возвращает 
        'массив данных, а "Criteria2" не существует.
    ElseIf mySingleFilter.Count > 2 Then
    
        myArray() = mySingleFilter.Criteria1
            
        For i = 1 To UBound(myArray) Step 1
            
            Debug.Print myArray(i)
            
        Next i
        
    End If
    
End Sub
1
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
19.04.2013, 11:24  [ТС] 15
Скрипт , верно ли я понял что это решеие работает только на активном листе. И другого способа нет?
0
5471 / 1149 / 50
Регистрация: 15.09.2012
Сообщений: 3,515
19.04.2013, 11:56 16
oleggy, у вас же есть VBA, вот и проверьте, будет ли работать код на другом листе.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
19.04.2013, 12:06  [ТС] 17
Может кто подскажет, почему так?

Первый раз я прменил автофильтр и отфильтровал колонку №1 по массиву filter_1, так:

Workbooks("файл.xls").Worksheets("Sheet1").UsedRange.AutoFilter Field:=1, Criteria1:=filter, Operator:=xlFilterValues

Далее из полученного списка отфильтрованных значений из колонки №3, я сформировал новый массив фильтрации - filter_2, и применил фильтр повторно к колонке №3, командой:

Workbooks("файл.xls").Worksheets("Sheet1").UsedRange.AutoFilter Field:=3, Criteria1:=filter_2, Operator:=xlFilterValues

На выходе получилось что автофильтр отфильтровал некорректно. Точнее, в колонке №3 по всем данным были сняты галочки. Вот, смотрите на рисунке.

А должно было что бы стояли галочки напротив данных которые были в массие filter_2.

Может я чего то непонял?
Миниатюры
Как отфильтровать уже отфильтрованные значения таблице Excel  
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
22.04.2013, 09:15  [ТС] 18
Вообщем есть вопросы.
Скрипт, твой пример хороший. Разбирался в нем и понял что:
у объекта AutoFilter есть свойство Filters, благодяря которому можно узнать список выбранных значений в колонке автофильтра.
Т.е. код:
Visual Basic
1
.AutoFilter.Filters(1)
возвратит список значений автофильтра которые были применены в колонке №1.
Но если в этой колонке не было применено фильтации то ничего не возвращается.

Мне же нужно узнать каким образом можно полчить список значений которые образовались в колонке №2 после применения фильтрации по колонке №1.
Дело в том что в колонке №2 я ничего и не могу выбать т.к. мне чтоб отфильтровать по колонке №2 нужно хотя бы узнать список доступных знчений для фильтрации в этой колонке..
0
5471 / 1149 / 50
Регистрация: 15.09.2012
Сообщений: 3,515
22.04.2013, 09:26 19
oleggy, проанализировав члены объекта "Filter", прихожу к выводу, что в Excel-VBA нет средств для того, что вы хотите в сообщении #19.

Может кто опровергнет это утверждение.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
22.04.2013, 09:45  [ТС] 20
Казанский , твое решение это использование:
свойства Range у объекта AutoFilter
Т.е. код:
Visual Basic
1
.AutoFilter.Range
возвращает область к которой был применен фильтр.
А если еще в добавок написать так:
Visual Basic
1
.AutoFilter.Range.Сolumns(1).specialcells(xlcelltypevisible)
то выходит что возвратится объект с данными по колонке №1 которые были отфильтрованы.

НО этот случай не подходит мне потому что в этом случае я получаю отфильтрованные данные, мне же нужно получить список фильтруемых данных. Как на рисунке.

Добавлено через 14 минут
Цитата Сообщение от Скрипт Посмотреть сообщение
oleggy, проанализировав члены объекта "Filter", прихожу к выводу, что в Excel-VBA нет средств для того, что вы хотите в сообщении #19.
Может кто опровергнет это утверждение.
По идее если это отображает Excel то программно можно получить доступ к этим данным.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2013, 09:45
Помогаю со студенческими работами здесь

Как отфильтровать дубликаты записей в таблице?
Всем привет Нужна помощь есть табличка в ней записи (время, название обекта, и тд) эти записи...

Экспорт в Excel отфильтрованные данные из подчиненной формы
Возникла следующая задача - в Аксе на форме есть подчиненная табличная форма, созданная на основе...

Как отфильтровать ячейки с формулами в 2007 Excel?
Здравствуйте. Как можно отфильтровать ячейки, отображаемый результат которых формируется...

Добавить значение в таблицу, только в том случае, если в таблице уже нету такого значения.
Есть метод добавления в таблицу данных. Как мне сделать так, чтобы значение добавилось только в том...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru