Страницы: 1
RSS
Автоматическая фильтрация столбца с определенными значениями, взятыми из другого столбца.
 
Ребят, HELP!!! Не пойму как сделать макрос, который будет работать с фильтрами. Цель такая: Есть первый столбец с n количеством значений и есть второй столбец, в другом листе этой же книги, который содержит в себе повторяющиеся значения как в первом столбце. Нужно отфильтровать первый столбец так, чтобы фильтр взял за основу значения из второго столбца, засунул себе в критерий отбора (не знаю как правильно, для меня это список значений с галочками, которые вручную очень долго надо клацать) и выдал результат в виде отфильтрованных значений. Я приложил файл где пример этих столбцов есть. Я даже не понимаю с чего начать, поэтому и обращаюсь к Вам.

Пример макроса могу показать из макрорекордера со своими дополнениями, но как обычно по незнанию лезут ошибки.
Код
Sub Ìàêðîñ1()
    ActiveSheet.Range("$D$2:$I$51586").AutoFilter Field:=3, Criteria1:=Array( _
        ActiveWorkbook.Worksheets("Ëèñò3").Range("$D$2:$I$51586")), Operator:=xlFilterValues
End Sub
Изменено: victorSwild - 18.07.2019 13:55:56
 
victorSwild, вот Вам вариантик:
Код
Option Explicit

Sub Макрос1()
    Dim filterValuesRn  As Range, RangeToAutofilterRn As Range, filterArr() As String, i As Long
    ' Диапазон 2 (значения в фильтр)
    Set filterValuesRn = ThisWorkbook.Sheets(2).Range("A2:A14")
    ' Диапазон 1 (что фильтруем)
    Set RangeToAutofilterRn = ThisWorkbook.Sheets(1).Range("B1:B26")
    
    ' Массив со значениями для фильтрациии
    ' Заполняем из диапазона 2
    ReDim filterArr(0 To filterValuesRn.Cells.Count - 1)
    For i = 0 To filterValuesRn.Cells.Count - 1
        filterArr(i) = filterValuesRn.Cells(i + 1)
    Next i
    
    ' Если на листе с диапазоном 1 уже есть автофильтр - сначала снимем все текущие фильтры
    If RangeToAutofilterRn.Parent.AutoFilterMode = True Then RangeToAutofilterRn.Parent.AutoFilter.ShowAllData
    ' Применим фильтр
    RangeToAutofilterRn.AutoFilter Field:=1, Criteria1:=filterArr, Operator:=xlFilterValues
End Sub
In GoTo we trust
 
Большое спасибо за вариант! Прям то, что нужно. Я настроил его под свою книгу и у меня вылетела ошибка. Я только поменял имена столбцов и листов, а так же изменил величину диапазона ячеек. Ваш пример в документе работает отлично, вот то что надо, а когда настраиваю под себя, то дает сбои почему-то. Пытался и ячейку выделить, к которой применять фильтр и проверил ячейки на объединение, но все напрасно. Пока не знаю в чем причина ошибки.
Код
Sub Макрос1()
    Dim filterValuesRn  As Range, RangeToAutofilterRn As Range, filterArr() As String, i As Long
    ' Диапазон 2 (значения в фильтр)
    Set filterValuesRn = ThisWorkbook.Sheets(3).Range("A1:A150")
    ' Диапазон 1 (что фильтруем)
    Set RangeToAutofilterRn = ThisWorkbook.Sheets(4).Range("F1:F70000")
     
    ' Массив со значениями для фильтрациии
    ' Заполняем из диапазона 2
    ReDim filterArr(0 To filterValuesRn.Cells.Count - 1)
    For i = 0 To filterValuesRn.Cells.Count - 1
        filterArr(i) = filterValuesRn.Cells(i + 1)
    Next i
     
    ' Если на листе с диапазоном 1 уже есть автофильтр - сначала снимем все текущие фильтры
    If RangeToAutofilterRn.Parent.AutoFilterMode = True Then RangeToAutofilterRn.Parent.AutoFilter.ShowAllData
    ' Применим фильтр
    RangeToAutofilterRn.AutoFilter Field:=1, Criteria1:=filterArr, Operator:=xlFilterValues
End Sub
Изменено: victorSwild - 18.07.2019 09:23:04
 
victorSwild, хм, проверил Ваш код - у меня все сработало, см. приложение (только диапазон уменьшил с 7000 до 1000 чтобы пример влез в 100кб, но 7000 тоже работал).
Не могли бы Вы сделать какой-то пример из Ваших данных для теста?
In GoTo we trust
 
tolstak, сейчас попробую уменьшить свою таблицу и скинуть пример.

Вот:
Я понял ошибку. У меня порядок листов был не верный: Лист4, Лист1, Лист2, Лист3, а надо по порядку верному. Поменял их между собой и все заработало!
Изменено: victorSwild - 18.07.2019 14:17:30
 
victorSwild, рад что Вы разобрались  :)
Можно к листам обращаться еще по именам, не обязательно по номеру в книге. Т.е
Код
ThisWorkbook.Sheets(3).Range("A1:A150")
у Вас будет работать с третьим листом, а вот так - с листом "КакоетоИмяЛиста":
Код
ThisWorkbook.Sheets("КакоетоИмяЛиста").Range("A1:A150")
In GoTo we trust
 
tolstak, так вот как это делать, а я пробовал без кавычек, просто в скобках имя прописывать, потом ошибка все равно была. Спасибо большое за помощь! Вы мне очень помогли с вопросом!
Страницы: 1
Наверх