Страницы: 1
RSS
Автофильтр по выделенному на другом листе диапазону ячеек
 
Добрый день!

Довольно часто сталкиваюсь с необходимостью фильтра столбца таблицы по нескольким критериям. В сети нашел макрос, который преобразует выделенный диапазон ячеек в критерии для фильтра.
Код
Sub FilterMultipleCriteria()
Dim filterRange As Range, filterValues() As Variant, cl As Range, i As Integer
    Set filterRange = Range("A1")
        If Selection.Count > 1 Then
    ReDim filterValues(Selection.SpecialCells(xlCellTypeVisible).Count - 1)
        Else
    ReDim filterValues(Selection.Cells.Count - 1)
    i = 0
    End If
    For Each cl In Selection
    ReDim Preserve filterValues(i)
        filterValues(i) = cl.Text
        i = i + 1
    Next cl

Dim RowNumber As Integer
RowNumber = Val(InputBox("Row Number"))
    filterRange.AutoFilter Field:=RowNumber, Criteria1:=filterValues, Operator:=xlFilterValues
End Sub
Макрос работает не совсем корректно, а именно, неправильно фильтрует по выбранным ячейка если они уже отфильтрованы. Пример прилагаю.
Изменено: neqkeet - 21.11.2016 21:32:29
 
Макрос слепил другой, однако проблемы с фильтрацией остались. Таблица фильтруется некорректно если выбранные ячейки с условиями уже были отфильтрованы. Добавил пример.
Изменено: neqkeet - 21.11.2016 21:26:12
 
Цитата
neqkeet написал:
The_Prist , прошу гуру помочь.
Можем вместе позвать: ДИМАThe_Prist,ВЫХОДИ!!!
There is no knowledge that is not power
 
Удалил я то сообщение...
 
Цитата
vikttur написал:
Удалил я то сообщение...
Предупреждать надо!

По теме:
Цитата
neqkeet написал:
Макрос работает не совсем корректно, а именно, неправильно фильтрует по выбранным ячейка если они уже отфильтрованы.
Ну а что вы хотели? Фильтр не запоминает предыдущие отфильтрованные значения - это можно сделать только в экселевском интерфейсе (да и то - начиная с 2010-го офиса).
There is no knowledge that is not power
 
Вы открывали мой пример? Мне не нужно чтобы макрос запоминал предыдущие значения. Видимо я неправильно выразился. Макрос фильтрует некорректно если есть фильтр на другом столбце.  Т.е. ячейки после фильтрации другого столбца находятся друг от друга далеко. Например, номер строки одной ячейки 10, а другой - 500.  Макрос подцепляет другие значения, а не только выбранные.
 
Цитата
neqkeet написал: если есть фильтр на другом столбце
То что надо сделать чтобы было корректно по-Вашему?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Тогда Вам нужны Areas - именно там лежат ячейки несмежных диапазонов. Общий код такой (в принципе, он и для смежных пойдёт):
Код
Sub F()

    Dim rngArea As Range
    Dim cell As Range
    
    For Each rngArea In Selection.Areas
        For Each cell In rngArea
            '// Что-то делаем
        Next
    Next
    
End Sub
There is no knowledge that is not power
 
Кросс:
http://www.excelworld.ru/forum/10-31223-201800-9-1
Я сам - дурнее всякого примера! ...
 
Цитата
JayBhagavan написал: То что надо сделать чтобы было корректно по-Вашему?
Помочь мне с кодом. :) Если Вы намекаете на то, что нужно снять все фильтры, то в моем случае это не решение. Таблица на которой будут применять макрос имеет около 35000 строк и 25 столбцов, и уже отфильтрована по нескольким столбцам. Каждый раз снимать и добавлять фильтр, пускай даже макросом, не вариант.

Цитата
SuperCat написал: Тогда Вам нужны Areas - именно там лежат ячейки несмежных диапазонов. Общий код такой (в принципе, он и для смежных пойдёт):
Вы не могли бы применить свою идею к моему макросу? Забыл упомянуть, что с VBA я на Вы, а макрос сверху слепил сам не пойму как из нескольких, найденных в сети. :)
 
Цитата
neqkeet написал: Если Вы намекаете
Ни на что не намекаю. Задаю вопросы, т.к. не понимаю Ваших намёков, то бишь чего именно не так и что в итоге должно быть. Ваш ответ ясности не внёс.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Для того чтобы понять что не так,  нужно открыть приложенный мною пример. Выделить желтые ячейки и выполнить макрос (вроде в файле присутствует). В inputbox номер столбца для фильтрации указать 3.

Как должно быть: столбец C должен отфильтроваться только по значениям выделенных ячеек. (со значениями 3223586 и 23881).
Изменено: neqkeet - 21.11.2016 23:05:43
 
neqkeet, открыл и выполнил. Всё в порядке. Немного почистил макрос. У меня работает:
Код
Option Explicit

Sub FilterMultipleCriteria()
    Dim filterRange As Range, filterValues() As Variant, cl As Range, i As Integer
    Set filterRange = Range("A1")
    If Selection.Count > 1 Then
        ReDim filterValues(1 To Selection.SpecialCells(xlCellTypeVisible).Count)
    Else
        ReDim filterValues(1 To Selection.Cells.Count)
        i = 0
    End If
    For Each cl In Selection
        i = i + 1
        filterValues(i) = cl.Text
    Next cl
    Dim ColNumber As Integer
    ColNumber = Val(InputBox("COLUMN Number"))
    filterRange.AutoFilter Field:=ColNumber, Criteria1:=filterValues, Operator:=xlFilterValues
End Sub

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, после "чистки" запустил макрос и получил ошибку "Runtime error 9. Subscript out of range"

Вы значения просто выделяете или через ctrl по одному?
 
Цитата
neqkeet написал: через ctrl по одному
А как надо?
===
Ещё причесал версия 4...
Код
Option Explicit

Sub FilterMultipleCriteria()
    Dim filterRange As Range, filterValues() As Variant, cl As Range, i As Integer, rng As Range
    Set filterRange = Range("A1")
    Set rng = Selection '
    If rng.Cells.Count > 1 Then Set rng = rng.SpecialCells(xlCellTypeVisible)
    ReDim filterValues(1 To rng.Count)
    i = 0
    For Each cl In rng
        i = i + 1
        filterValues(i) = cl.Text
    Next cl
    Dim ColNumber As Integer
    ColNumber = rng.Column - filterRange.Column + 1 ' Val(InputBox("COLUMN Number"))
    filterRange.AutoFilter Field:=ColNumber, Criteria1:=filterValues, Operator:=xlFilterValues
End Sub
Изменено: JayBhagavan - 21.11.2016 23:04:00

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Шикарно причесали! :D Работает и через ctrl и при сплошном выделении.  :)  Прошу добавить 1 нюанс - выбор ячейки не по номеру столбца, а по его названию ("А", "B" и т.д.), дабы не запутаться.

Update:
Первый раз лучший причесали, теперь не работает при сплошном выделении тех же строк 10 и 273. Ошибка "type mismatch"

Update 2: Пропал input box  8-0
Изменено: neqkeet - 21.11.2016 23:17:15
 
neqkeet, см. последнюю - 4ю правку. По букве не выйдет, т.к. Field принимает только число. Из справки:
Цитата
The integer offset of the field on which you want to base the filter (from the left of the list; the leftmost field is field one).

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Вы строчите код быстрее чем я сообщения). Первая версия была самая четкая. (третью я не успел попробовать). Инпутбокс нужен, т.к. не всегда фильтруюсь именно по той колонке в которой находятся необходимые значения.

Update:

Сообразил, разкомментил код. :)
Изменено: neqkeet - 21.11.2016 23:15:06
 
neqkeet, инп.бокс не пропал. Я его закомментировал ибо мне лениво вводить номер столбца, если его можно вычислить. Просто в 15й строке удалите после равно и до Val и будет Вам счастье.
Изменено: JayBhagavan - 21.11.2016 23:14:53

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо Вам огромное! Сэкономили уйму времени на работе!  :)
 
neqkeet, вот и ладненько. Пожалуйста. :)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Добрый день, у меня задача похожая, но нужно чтобы выделенный диапазон не попадал в отфильтрованные строки, подскажите пжлста как это реализовать?
Страницы: 1
Наверх