Фильтрация одномерного массива в VBA Excel с помощью функции Filter. Синтаксис и параметры функции Filter. Пример фильтрации одномерного массива.
Filter – это функция, которая возвращает массив, содержащий строки исходного одномерного массива, соответствующие заданным условиям фильтрации.
Примечания
- исходный (фильтруемый) массив должен быть одномерным и содержать строки;
- индексация возвращенного массива начинается с нуля;
- возвращенный массив содержит ровно столько элементов, сколько строк исходного массива соответствуют заданным условиям фильтрации;
- переменная, которой присваивается возвращенный массив, должна быть универсального типа (As Variant) и объявлена не как массив (не myArray() со скобками, а myArray без скобок).
Функция Filter автоматически преобразует обычную переменную универсального типа, которой присваивается отфильтрованный список, в одномерный массив с необходимым количеством элементов.
Синтаксис
Filter(sourcearray, match, [include], [compare]) |
Параметры
Параметр | Описание |
---|---|
sourcearray | Обязательный параметр. Одномерный массив, элементы которого требуется отфильтровать |
match | Обязательный параметр. Искомая строка. |
include | Необязательный параметр. Значение Boolean, которое указывает:
|
compare | Необязательный параметр. Числовое значение (константа), указывающее тип сравнения строк. По умолчанию – 0 (vbBinaryCompare). |
Compare (значения)
Параметр compare может принимать следующие значения:
Константа | Значение | Описание |
---|---|---|
vbUseCompareOption | -1 | используется тип сравнения, заданный оператором Option Compare |
vbBinaryCompare | 0 | выполняется двоичное сравнение (регистр имеет значение) |
vbTextCompare | 1 | выполняется текстовое сравнение (без учета регистра) |
Пример фильтрации
Фильтрация списка в столбце «A» по словам, начинающимся с буквы «К», и загрузка результатов в столбец «B»:
Пример кода VBA Excel с функцией Filter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Primer() Dim arr1, arr2, arr3, i As Long ‘Присваиваем переменной arr1 массив значений столбца A arr1 = Range(«A1:A» & Range(«A1»).End(xlDown).Row) ‘Копируем строки двумерного массива arr1 в одномерный arr2 ReDim arr2(1 To UBound(arr1)) For i = 1 To UBound(arr1) arr2(i) = arr1(i, 1) Next ‘Фильтруем строки массива arr2 по вхождению подстроки «К» ‘и присваиваем отфильтрованные строки переменной arr3 arr3 = Filter(arr2, «К») ‘Копируем строки из массива arr3 в столбец «B» For i = 0 To UBound(arr3) Cells(i + 1, 2) = arr3(i) Next End Sub |
I have 8 variables in column A, 1,2,3,4,5 and A, B, C.
My aim is to filter out A, B, C and display only 1-5.
I can do this using the following code:
My_Range.AutoFilter Field:=1, Criteria1:=Array("1", "2", "3","4","5"), _
Operator:=xlFilterValues
But what the code does is it filters variables 1 to 5 and displays them.
I want to do the opposite, but yielding the same result, by filtering out A, B, C and showing variables 1 to 5
I tried this code:
My_Range.AutoFilter Field:=1, Criteria1:=Array("<>A", "<>B", "<>C"), _
Operator:=xlFilterValues
But it did not work.
Why cant I use this code ?
It gives this error:
Run time error 1004 autofilter method of range class failed
How can I perform this?
Igor F.
2,6172 gold badges31 silver badges39 bronze badges
asked Feb 18, 2015 at 4:03
1
I think (from experimenting — MSDN is unhelpful here) that there is no direct way of doing this. Setting Criteria1
to an Array
is equivalent to using the tick boxes in the dropdown — as you say it will only filter a list based on items that match one of those in the array.
Interestingly, if you have the literal values "<>A"
and "<>B"
in the list and filter on these the macro recorder comes up with
Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B"
which works. But if you then have the literal value "<>C"
as well and you filter for all three (using tick boxes) while recording a macro, the macro recorder replicates precisely your code which then fails with an error. I guess I’d call that a bug — there are filters you can do using the UI which you can’t do with VBA.
Anyway, back to your problem. It is possible to filter values not equal to some criteria, but only up to two values which doesn’t work for you:
Range("$A$1:$A$9").AutoFilter Field:=1, Criteria1:="<>A", Criteria2:="<>B", Operator:=xlAnd
There are a couple of workarounds possible depending on the exact problem:
- Use a «helper column» with a formula in column B and then filter on that — e.g.
=ISNUMBER(A2)
or=NOT(A2="A", A2="B", A2="C")
then filter onTRUE
- If you can’t add a column, use autofilter with
Criteria1:=">-65535"
(or a suitable number lower than any you expect) which will filter out non-numeric values — assuming this is what you want - Write a VBA sub to hide rows (not exactly the same as an autofilter but it may suffice depending on your needs).
For example:
Public Sub hideABCRows(rangeToFilter As Range)
Dim oCurrentCell As Range
On Error GoTo errHandler
Application.ScreenUpdating = False
For Each oCurrentCell In rangeToFilter.Cells
If oCurrentCell.Value = "A" Or oCurrentCell.Value = "B" Or oCurrentCell.Value = "C" Then
oCurrentCell.EntireRow.Hidden = True
End If
Next oCurrentCell
Application.ScreenUpdating = True
Exit Sub
errHandler:
Application.ScreenUpdating = True
End Sub
answered Feb 18, 2015 at 9:03
aucupariaaucuparia
2,03118 silver badges27 bronze badges
2
I don’t have found any solution on Internet, so I have implemented one.
The Autofilter code with criteria is then
iColNumber = 1
Dim aFilterValueArray() As Variant
Call ConstructFilterValueArray(aFilterValueArray, iColNumber, Array("A", "B", "C"))
ActiveSheet.range(sRange).AutoFilter Field:=iColNumber _
, Criteria1:=aFilterValueArray _
, Operator:=xlFilterValues
In fact, the ConstructFilterValueArray() method (not function) get all distinct values that it found in a specific column and remove all values present in last argument.
The VBA code of this method is
'************************************************************
'* ConstructFilterValueArray()
'************************************************************
Sub ConstructFilterValueArray(a() As Variant, iCol As Integer, aRemoveArray As Variant)
Dim aValue As New Collection
Call GetDistinctColumnValue(aValue, iCol)
Call RemoveValueList(aValue, aRemoveArray)
Call CollectionToArray(a, aValue)
End Sub
'************************************************************
'* GetDistinctColumnValue()
'************************************************************
Sub GetDistinctColumnValue(ByRef aValue As Collection, iCol As Integer)
Dim sValue As String
iEmptyValueCount = 0
iLastRow = ActiveSheet.UsedRange.Rows.Count
Dim oSheet: Set oSheet = Sheets("X")
Sheets("Data")
.range(Cells(1, iCol), Cells(iLastRow, iCol)) _
.AdvancedFilter Action:=xlFilterCopy _
, CopyToRange:=oSheet.range("A1") _
, Unique:=True
iRow = 2
Do While True
sValue = Trim(oSheet.Cells(iRow, 1))
If sValue = "" Then
If iEmptyValueCount > 0 Then
Exit Do
End If
iEmptyValueCount = iEmptyValueCount + 1
End If
aValue.Add sValue
iRow = iRow + 1
Loop
End Sub
'************************************************************
'* RemoveValueList()
'************************************************************
Sub RemoveValueList(ByRef aValue As Collection, aRemoveArray As Variant)
For i = LBound(aRemoveArray) To UBound(aRemoveArray)
sValue = aRemoveArray(i)
iMax = aValue.Count
For j = iMax To 0 Step -1
If aValue(j) = sValue Then
aValue.Remove (j)
Exit For
End If
Next j
Next i
End Sub
'************************************************************
'* CollectionToArray()
'************************************************************
Sub CollectionToArray(a() As Variant, c As Collection)
iSize = c.Count - 1
ReDim a(iSize)
For i = 0 To iSize
a(i) = c.Item(i + 1)
Next
End Sub
This code can certainly be improved in returning an Array of String but working with Array in VBA is not easy.
CAUTION: this code work only if you define a sheet named X because CopyToRange parameter used in AdvancedFilter() need an Excel Range !
It’s a shame that Microfsoft doesn’t have implemented this solution in adding simply a new enum as xlNotFilterValues ! … or xlRegexMatch !
answered Jan 18, 2018 at 12:44
schlebeschlebe
3,2885 gold badges38 silver badges49 bronze badges
Alternative using VBA’s Filter function
As an innovative alternative to @schlebe ‘s recent answer, I tried to use the Filter
function integrated in VBA, which allows to filter out a given search string setting the third argument to False. All «negative» search strings (e.g. A, B, C) are defined in an array. I read the criteria in column A to a datafield array and basicly execute a subsequent filtering (A — C) to filter these items out.
Code
Sub FilterOut()
Dim ws As Worksheet
Dim rng As Range, i As Integer, n As Long, v As Variant
' 1) define strings to be filtered out in array
Dim a() ' declare as array
a = Array("A", "B", "C") ' << filter out values
' 2) define your sheetname and range (e.g. criteria in column A)
Set ws = ThisWorkbook.Worksheets("FilterOut")
n = ws.Range("A" & ws.Rows.Count).End(xlUp).row
Set rng = ws.Range("A2:A" & n)
' 3) hide complete range rows temporarily
rng.EntireRow.Hidden = True
' 4) set range to a variant 2-dim datafield array
v = rng
' 5) code array items by appending row numbers
For i = 1 To UBound(v): v(i, 1) = v(i, 1) & "#" & i + 1: Next i
' 6) transform to 1-dim array and FILTER OUT the first search string, e.g. "A"
v = Filter(Application.Transpose(Application.Index(v, 0, 1)), a(0), False, False)
' 7) filter out each subsequent search string, i.e. "B" and "C"
For i = 1 To UBound(a): v = Filter(v, a(i), False, False): Next i
' 8) get coded row numbers via split function and unhide valid rows
For i = LBound(v) To UBound(v)
ws.Range("A" & Split(v(i) & "#", "#")(1)).EntireRow.Hidden = False
Next i
End Sub
answered Jan 18, 2018 at 22:20
T.M.T.M.
9,2293 gold badges32 silver badges57 bronze badges
An option using AutoFilter
Option Explicit
Public Sub FilterOutMultiple()
Dim ws As Worksheet, filterOut As Variant, toHide As Range
Set ws = ActiveSheet
If Application.WorksheetFunction.CountA(ws.Cells) = 0 Then Exit Sub 'Empty sheet
filterOut = Split("A B C D E F G")
Application.ScreenUpdating = False
With ws.UsedRange.Columns("A")
If ws.FilterMode Then .AutoFilter
.AutoFilter Field:=1, Criteria1:=filterOut, Operator:=xlFilterValues
With .SpecialCells(xlCellTypeVisible)
If .CountLarge > 1 Then Set toHide = .Cells 'Remember unwanted (A, B, and C)
End With
.AutoFilter
If Not toHide Is Nothing Then
toHide.Rows.Hidden = True 'Hide unwanted (A, B, and C)
.Cells(1).Rows.Hidden = False 'Unhide header
End If
End With
Application.ScreenUpdating = True
End Sub
answered Apr 20, 2018 at 0:01
paul bicapaul bica
10.5k4 gold badges22 silver badges41 bronze badges
Here an option using a list written on some range, populating an array that will be fiiltered. The information will be erased then the columns sorted.
Sub Filter_Out_Values()
'Automation to remove some codes from the list
Dim ws, ws1 As Worksheet
Dim myArray() As Variant
Dim x, lastrow As Long
Dim cell As Range
Set ws = Worksheets("List")
Set ws1 = Worksheets(8)
lastrow = ws.Cells(Application.Rows.Count, 1).End(xlUp).Row
'Go through the list of codes to exclude
For Each cell In ws.Range("A2:A" & lastrow)
If cell.Offset(0, 2).Value = "X" Then 'If the Code is associated with "X"
ReDim Preserve myArray(x) 'Initiate array
myArray(x) = CStr(cell.Value) 'Populate the array with the code
x = x + 1 'Increase array capacity
ReDim Preserve myArray(x) 'Redim array
End If
Next cell
lastrow = ws1.Cells(Application.Rows.Count, 1).End(xlUp).Row
ws1.Range("C2:C" & lastrow).AutoFilter field:=3, Criteria1:=myArray, Operator:=xlFilterValues
ws1.Range("A2:Z" & lastrow).SpecialCells(xlCellTypeVisible).ClearContents
ws1.Range("A2:Z" & lastrow).AutoFilter field:=3
'Sort columns
lastrow = ws1.Cells(Application.Rows.Count, 1).End(xlUp).Row
'Sort with 2 criteria
With ws1.Range("A1:Z" & lastrow)
.Resize(lastrow).Sort _
key1:=ws1.Columns("B"), order1:=xlAscending, DataOption1:=xlSortNormal, _
key2:=ws1.Columns("D"), order1:=xlAscending, DataOption1:=xlSortNormal, _
Header:=xlYes, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin
End With
End Sub
answered Feb 13, 2019 at 11:38
This works for me:
This is a criteria over two fields/columns (9 and 10), this filters rows with values >0 on column 9 and rows with values 4, 7, and 8 on column 10. lastrow
is the number of rows on the data section.
ActiveSheet.Range("$A$1:$O$" & lastrow).AutoFilter Field:=9, Criteria1:=">0", Operator:=xlAnd
ActiveSheet.Range("$A$1:$O$" & lastrow).AutoFilter Field:=10, Criteria1:=Arr("4","7","8"), Operator:=xlFilterValues
h3t1
1,1142 gold badges18 silver badges29 bronze badges
answered May 6, 2020 at 20:37
Okay, I solved it.
I’ve smashed my head about this problem several times over the years, but I’ve solved it.
All we need to do is look at all the values that are actually IN the filter range, and if they’re not on the list of values we want to filter out, we add them to the «Filter For this item» list.
To note about this code:
- I wrote this to act on multiple sheets, and I’m not going to change that as I’m at work and don’t have time. I’m sure you can figure it out.
- I don’t think you need to work in
Option base 1
… But I am, so if you run into issues… might be that. - Despite how many hundreds of thousands of times it’s checking and rechecking the same arrays, it’s remarkably fast.
- I’m sure there is a way to redim
KeepArray
, but I didn’t have time to consider it.
Option Explicit
Option Base 1
Sub FilterTable()
Dim WS As Worksheet
Dim L As Long
Dim I As Long
Dim N As Long
Dim tbl As ListObject
Dim tblName As String
Dim filterArray
Dim SrcArray
Dim KeepArray(1 To 5000) ' you might be able to figure out a way to redim this easiely later on.. for now I'm just oversizing it.
N = 0
filterArray = Array("FilterMeOut007", _
"FilterMeOut006", _
"FilterMeOut005", _
"FilterMeOut004", _
"FilterMeOut003", _
"FilterMeOut002", _
"FilterMeOut001")
For Each WS In ThisWorkbook.Worksheets
Debug.Print WS.Name
If Left(WS.Name, 4) = "AR -" Then
With WS
tblName = Replace(WS.Name, " ", "_")
Set tbl = WS.ListObjects(tblName)
SrcArray = tbl.ListColumns(1).DataBodyRange
For I = 1 To UBound(SrcArray, 1)
If Not ExistsInArray(KeepArray, SrcArray(I, 1)) _
And Not ExistsInArray(filterArray, SrcArray(I, 1)) Then
N = N + 1
KeepArray(N) = SrcArray(I, 1)
End If
Next I
tbl.DataBodyRange.AutoFilter Field:=1, Criteria1:=KeepArray, Operator:=xlFilterValues
End With
End If
Next WS
End Sub
Function ExistsInArray(arr, Val) As Boolean
Dim I As Long
ExistsInArray = False
For I = LBound(arr) To UBound(arr)
If arr(I) = Val Then
ExistsInArray = True
Exit Function
End If
Next I
End Function
Please let me know if you run into any errors with this as I’d like to stress test and debug it as much as possible in the future to make it as portable as possible. I picture using it a lot.
answered Feb 16 at 2:31
Please check this one for filtering out values in a range; It works.
Selection.AutoFilter field:=33, Criteria1:="<>Array(IN1R,IN2R,INDA)", Operator:=xlFilterValues
Actually, the above code did not work. Hence I give a loop to hide the entire row whenever the active cell has the value that I am searching for.
For each cell in selection
If cell.value = “IN1R” or cell.value = “INR2” or cell.value = “INDA” then
Else
Activecell.Entirerow.Hidden = True
End if
Next
answered Apr 24, 2021 at 10:00
Стандартный Автофильтр для выборки из списков — вещь, безусловно, привычная и надежная. Но для создания сложных условий приходится выполнить не так уж мало действий. Например, чтобы отфильтровать значения попадающие в интервал от 100 до 200, необходимо развернуть список Автофильтра мышью, выбрать вариант Условие (Custom), а в новых версиях Excel: Числовые фильтры — Настраиваемый фильтр (Number filters — Custom filter). Затем в диалоговом окне задать два оператора сравнения, значения и логическую связку (И-ИЛИ) между ними:
Не так уж и долго, скажут некоторые. Да, но если в день приходится повторять эту процедуру по нескольку десятков раз? Выход есть — альтернативный фильтр с помощью макроса, который будет брать значения критериев отбора прямо из ячеек листа, куда мы их просто введем с клавиатуры. По сути, это будет похоже на расширенный фильтр, но работающий в реальном времени. Чтобы реализовать такую штуку, нам потребуется сделать всего два шага:
Шаг 1. Именованный диапазон для условий
Сначала надо создать именованный диапазон, куда мы будем вводить условия, и откуда макрос их будет брать. Для этого можно прямо над таблицей вставить пару-тройку пустых строк, затем выделить ячейки для будущих критериев (на рисунке это A2:F2) и дать им имя Условия, вписав его в поле имени в левом верхнем углу и нажав клавишу Enter. Для наглядности, я выделил эти ячейки желтым цветом:
Шаг 2. Добавляем макрос фильтрации
Теперь надо добавить к текущему листу макрос фильтрации по критериям из созданного диапазона Условия. Для этого щелкните правой кнопкой мыши по ярлычку листа и выберите команду Исходный текст (Source text). В открывшееся окно редактора Visual Basic надо скопировать и вставить текст вот такого макроса:
Private Sub Worksheet_Change(ByVal Target As Range) Dim FilterCol As Integer Dim FilterRange As Range Dim CondtitionString As Variant Dim Condition1 As String, Condition2 As String If Intersect(Target, Range("Условия")) Is Nothing Then Exit Sub On Error Resume Next Application.ScreenUpdating = False 'определяем диапазон данных списка Set FilterRange = Target.Parent.AutoFilter.Range 'считываем условия из всех измененных ячеек диапазона условий For Each cell In Target.Cells FilterCol = cell.Column - FilterRange.Columns(1).Column + 1 If IsEmpty(cell) Then Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol Else If InStr(1, UCase(cell.Value), " ИЛИ ") > 0 Then LogicOperator = xlOr ConditionArray = Split(UCase(cell.Value), " ИЛИ ") Else If InStr(1, UCase(cell.Value), " И ") > 0 Then LogicOperator = xlAnd ConditionArray = Split(UCase(cell.Value), " И ") Else ConditionArray = Array(cell.Text) End If End If 'формируем первое условие If Left(ConditionArray(0), 1) = "<" Or Left(ConditionArray(0), 1) = ">" Then Condition1 = ConditionArray(0) Else Condition1 = "=" & ConditionArray(0) End If 'формируем второе условие - если оно есть If UBound(ConditionArray) = 1 Then If Left(ConditionArray(1), 1) = "<" Or Left(ConditionArray(1), 1) = ">" Then Condition2 = ConditionArray(1) Else Condition2 = "=" & ConditionArray(1) End If End If 'включаем фильтрацию If UBound(ConditionArray) = 0 Then Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1 Else Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1, _ Operator:=LogicOperator, Criteria2:=Condition2 End If End If Next cell Set FilterRange = Nothing Application.ScreenUpdating = True End Sub
Все.
Теперь при вводе любых условий в желтые ячейки нашего именованного диапазона тут же будет срабатывать фильтрация, отображая только нужные нам строки и скрывая ненужные:
Как и в случае с классическими Автофильтром (Filter) и Расширенным фильтром (Advanced Filter), в нашем фильтре макросом можно смело использовать символы подстановки:
- * (звездочка) — заменяет любое количество любых символов
- ? (вопросительный знак) — заменяет один любой символ
и операторы логической связки:
- И — выполнение обоих условий
- ИЛИ — выполнение хотя бы одного из двух условий
и любые математические символы неравенства (>,<,=,>=,<=,<>).
При удалении содержимого ячеек желтого диапазона Условия автоматически снимается фильтрация с соответствующих столбцов.
P.S.
- Если у вас Excel 2007 или 2010 не забудьте сохранить файл с поддержкой макросов (в формате xlsm), иначе добавленный макрос умрет.
- Данный макрос не умеет работать с «умными таблицами»
Ссылки по теме
- Что такое макросы, куда вставлять код макроса на VBA, как их использовать?
- Умные таблицы Excel 2007/2010
- Расширенный фильтр и немного магии
Содержание
- Метод Range.AutoFilter (Excel)
- Синтаксис
- Параметры
- Возвращаемое значение
- Примечания
- Пример
- Поддержка и обратная связь
- Функция filter
- Синтаксис
- Параметры
- См. также
- Поддержка и обратная связь
- VBA Excel. Функция Filter (фильтрация массива)
- Функция Filter
- Примечания
- Синтаксис
- Параметры
- Compare (значения)
- Пример фильтрации
- Vba excel фильтрация строк
Метод Range.AutoFilter (Excel)
Фильтрует список с помощью автофильтра.
Синтаксис
выражение.AutoFilter (Field, Criteria1, Operator, Criteria2, SubField, VisibleDropDown)
выражение: выражение, возвращающее объект Range.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Field | Необязательный | Variant | Целочисленное смещение поля, на основе которого требуется создать фильтр (слева от списка; крайнее левое поле — значение 1). |
Criteria1 | Необязательный | Variant | Условия (строка, например «101»). Используйте «=» для поиска пустых полей, «<>» для поиска непустых полей и «> для выбора полей (Нет данных) в типах данных. |
Если этот аргумент пропущен, все условия имеют значение All. Если параметру Operator присвоено значение xlTop10Items, параметр Criteria1 указывает количество элементов (например, «10»). Operator Необязательный XlAutoFilterOperator Константа XlAutoFilterOperator, указывающая тип фильтра. Criteria2 Необязательный Variant Второе условие (строка). Используется с параметрами Criteria1 и Operator для создания составных условий. Также используется в качестве одного условия для полей даты, фильтруемых по дате, месяцу или году. За ним следует массив, уточняющий фильтрацию Массив(Уровень, Дата), где «Уровень» принимает значения 0–2 (год,месяц,дата), а «Дата» — одна допустимая дата в периоде фильтрации. SubField Необязательный Variant Поле из типа данных, для которого применяются условия (например, поле Population из типа Geography или поле Volume из типа Stocks). Пропуск этого значения указывает на «(отображаемое значение)». VisibleDropDown Необязательный Variant Значение True, чтобы отобразить стрелку раскрывающегося списка автофильтра для фильтруемого поля. Значение False, чтобы скрыть стрелку раскрывающегося списка автофильтра для фильтруемого поля. По умолчанию используется значение True.
Возвращаемое значение
Примечания
Если опустить все аргументы, этот метод просто переключает отображение стрелок раскрывающихся списков автофильтров в указанном диапазоне.
В Excel для Mac этот метод не поддерживается. Поддерживаются аналогичные методы для Selection и ListObject.
В отличие от формул, во вложенных полях не требуется использовать квадратные скобки для добавления пробелов.
Пример
В этом примере выполняется фильтрация списка, начинающегося в ячейке A1 на листе «Лист1», чтобы отображались только те записи, в которых первое поле содержит строку «Otis». Стрелка раскрывающегося списка для поля 1 будет скрыта.
В этом примере выполняется фильтрация списка, начинающегося с ячейки A1 на листе «Лист1», для отображения только тех записей, в которых значения первого поля содержат вложенное поле Admin Division 1 (State/province/other) со значением «Washington».
В этом примере выполняется фильтрация таблицы «Таблица1» на листе «Лист1» для отображения только тех записей, в которых значения первого поля соответствуют отображаемому значению: 1, 3, Seattle или Redmond.
Типы данных могут применять несколько фильтров вложенных полей. В этом примере выполняется фильтрация таблицы «Таблица1» на листе «Лист1» для отображения только тех записей, в которых значения первого поля содержат вложенное поле Time zone(s) со значением «Pacific Time Zone», а вложенное поле Date Founded содержит значение 1851 или «(No Data)».
В этом примере выполняется фильтрация таблицы «Таблица1» на листе «Лист1» для отображения первых 10 записей для первого поля на основе вложенного поля Population.
В этом примере выполняется фильтрация таблицы «Таблица1» на листе «Лист1» для отображения всех записей января и февраля 2019 г. для поля 1. При этом не требуется наличие строки, содержащей 31 января.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Функция filter
Возвращает отсчитываемый от нуля массив, содержащий подмножество строкового массива на основе заданных условий фильтра.
Синтаксис
Filter(sourcearray, match, [ include, [ compare ]])
Синтаксис функции Filter содержит следующие именованные аргументы:
Part | Описание |
---|---|
sourcearray | Обязательно. Одномерный массив искомых строк. |
Матч | Обязательно. Искомая строка. |
include | Необязательный параметр. Значение Boolean указывает, следует ли возвращать подстроки, включающие или исключающие match. Если include имеет значение True, Filter возвращает подмножество массива, содержащего match в качестве подстроки. Если include имеет значение False, Filter возвращает подмножество массива, не содержащего match в качестве подстроки. |
compare | Необязательно. Числовое значение, указывающее тип сравнения строк. Значения см. в разделе «Значения». |
Параметры
Аргумент compare может принимать следующие значения:
Константа | Значение | Описание |
---|---|---|
vbUseCompareOption | –1 | Выполняет сравнение, используя параметр оператора Option Compare. |
vbBinaryCompare | 0 | Выполняется двоичное сравнение. |
vbTextCompare | 1 | Выполняется текстовое сравнение. |
vbDatabaseCompare | 2 | Только Microsoft Access. Выполняется сравнение на основе сведений из базы данных. |
Возвращенный функцией Filter массив содержит столько элементов, сколько необходимо для хранения совпавших элементов.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
VBA Excel. Функция Filter (фильтрация массива)
Фильтрация одномерного массива в VBA Excel с помощью функции Filter. Синтаксис и параметры функции Filter. Пример фильтрации одномерного массива.
Функция Filter
Примечания
- исходный (фильтруемый) массив должен быть одномерным и содержать строки;
- индексация возвращенного массива начинается с нуля;
- возвращенный массив содержит ровно столько элементов, сколько строк исходного массива соответствуют заданным условиям фильтрации;
- переменная, которой присваивается возвращенный массив, должна быть универсального типа (As Variant) и объявлена не как массив (не myArray() со скобками, а myArray без скобок).
Функция Filter автоматически преобразует обычную переменную универсального типа, которой присваивается отфильтрованный список, в одномерный массив с необходимым количеством элементов.
Синтаксис
Параметры
Параметр | Описание |
---|---|
sourcearray | Обязательный параметр. Одномерный массив, элементы которого требуется отфильтровать |
match | Обязательный параметр. Искомая строка. |
include | Необязательный параметр. Значение Boolean, которое указывает:
|
compare | Необязательный параметр. Числовое значение (константа), указывающее тип сравнения строк. По умолчанию – 0 (vbBinaryCompare). |
Compare (значения)
Параметр compare может принимать следующие значения:
Константа | Значение | Описание |
---|---|---|
vbUseCompareOption | -1 | используется тип сравнения, заданный оператором Option Compare |
vbBinaryCompare | 0 | выполняется двоичное сравнение (регистр имеет значение) |
vbTextCompare | 1 | выполняется текстовое сравнение (без учета регистра) |
Пример фильтрации
Фильтрация списка в столбце «A» по словам, начинающимся с буквы «К», и загрузка результатов в столбец «B»:
Источник
Vba excel фильтрация строк
Ф ильтры на VBA (AutoFilter Method): самое подробное руководство в рунете
Автор Дмитрий Якушев На чтение11 мин. Просмотров2.6k.
Итог: научиться создавать макросы, использовать фильтры на диапазоны и таблицы с помощью метода AutoFilter VBA. Статья содержит ссылки на примеры для фильтрации различных типов данных, включая текст, цифры, даты, цвета и значки.
Уровень мастерства: средний
- Скачать файл
- Написание макросов для фильтров
- Макро-рекордер — твой друг (или враг)
- Метод автофильтрации
- Написание кода автофильтра
- Шаг 1: Ссылка на диапазон или таблицу
- Диапазоны или таблицы?
- 5 (или 6) параметров автофильтра
- Шаг 2: Параметр поля
- Шаг 3: Параметры критериев
- Общие правила дляCriteria1 и Criteria2
- Шаг 4: Параметр оператора
- Автофильтр не является дополнением
- Как установить номер поля динамически
- Используйте таблицы Excel с фильтрами
- Фильтры и типы данных
- Почему метод автофильтрации такой сложный?
Файл Excel, содержащий код, можно скачать ниже. Этот файл содержит код для фильтрации различных типов данных и типов фильтров.
VBA AutoFilters Guide.xlsm (100.5 KB)
Н аписание макросов для фильтров
Фильтры являются отличным инструментом для анализа данных в Excel. Для большинства аналитиков и частых пользователей Excel фильтры являются частью нашей повседневной жизни. Мы используем раскрывающиеся меню фильтров для применения фильтров к отдельным столбцам в наборе данных. Это помогает нам связывать цифры с отчетами и проводить исследование наших данных.
Фильтрация также может быть трудоемким процессом. Особенно, когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем данные, чтобы затем копировать / вставлять их в другие листы или книги.
В этой статье объясняется, как создавать макросы для автоматизации процесса фильтрации. Это обширное руководство по методу автофильтра в VBA.
У меня также есть статьи с примерами для различных фильтров и типов данных, в том числе: пробелы, текст, числа, даты, цвета и значки, и очищающие фильтры.
М акро-рекордер — твой друг (или враг)
Мы можем легко получить код VBA для фильтров, включив макро-рекордер, а затем применив один или несколько фильтров к диапазону / таблице.
Вот шаги для создания макроса фильтра с помощью устройства записи макросов:
- Включите рекордер макросов:
- Вкладка «Разработчик»> «Запись макроса».
- Дайте макросу имя, выберите, где вы хотите сохранить код, и нажмите ОК.
- Примените один или несколько фильтров, используя раскрывающиеся меню фильтров.
- Остановите рекордер.
- Откройте редактор VB (вкладка «Разработчик»> Visual Basic) для просмотра кода.
Если вы уже использовали макрос-рекордер для этого процесса, то вы знаете, насколько он может быть полезен. Тем более, что наши критерии фильтрации становятся более сложными.
Код будет выглядеть примерно так:
ActiveSheet.ListObjects(«tblData»).Range.AutoFilter Field:=4, Criteria1:= _
ActiveSheet.ListObjects(«tblData»).Range.AutoFilter Field:=5, Criteria1:= _
«>=500″, Operator:=xlAnd, Criteria2:=»
Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.
Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.
М етод автофильтрации
Метод AutoFilter используется для очистки и применения фильтров к одному столбцу в диапазоне или таблице в VBA. Он автоматизирует процесс применения фильтров через выпадающие меню фильтров и делает, чтобы все работало.
Его можно использовать для применения фильтров к нескольким столбцам путем написания нескольких строк кода, по одной для каждого столбца. Мы также можем использовать Автофильтр, чтобы применить несколько критериев фильтрации к одному столбцу, так же, как в выпадающем меню фильтра, установив несколько флажков или указав диапазон дат.
Н аписание кода автофильтра
Вот пошаговые инструкции по написанию строки кода для автофильтра.
Ш аг 1: Ссылка на диапазон или таблицу
Метод AutoFilter является частью объекта Range. Поэтому мы должны ссылаться на диапазон или таблицу, к которым применяются фильтры на листе. Это будет весь диапазон, к которому применяются фильтры.
Следующие примеры включают / отключают фильтры в диапазоне B3: G1000 на листе автофильтра.
‘Автофильтр является членом объекта Range
‘Ссылка на весь диапазон, к которому применяются фильтры
‘Автофильтр включает / выключает фильтры, когда параметры не указаны.
‘Полностью квалифицированный справочник, начиная с уровня Workbook
Вот пример использования таблиц Excel.
‘Автофильтры на таблицах работают одинаково.
Dim lo As ListObject ‘Excel Table
‘Установить переменную ListObject (Table)
Set lo = Sheet1.ListObjects(1)
‘Автофильтр является членом объекта Range
‘Родителем объекта Range является объект List
Метод AutoFilter имеет 5 необязательных параметров, которые мы рассмотрим далее. Если мы не укажем ни один из параметров, как в приведенных выше примерах, метод AutoFilter включит / выключит фильтры для указанного диапазона. Это переключение. Если фильтры включены, они будут выключены, и наоборот.
Д иапазоны или таблицы?
Фильтры работают одинаково как для обычных диапазонов , так и для таблиц Excel .
Я отдаю предпочтение методу использования таблиц, потому что нам не нужно беспокоиться об изменении ссылок на диапазон при увеличении или уменьшении таблицы. Однако код будет одинаковым для обоих объектов. В остальных примерах кода используются таблицы Excel, но вы можете легко изменить это для обычных диапазонов.
5 (или 6) параметров автофильтра
Метод AutoFilter имеет 5 (или 6) необязательных параметров, которые используются для указания критериев фильтрации для столбца. Вот список параметров.
Страница справки MSDN
Мы можем использовать комбинацию этих параметров, чтобы применять различные критерии фильтрации для разных типов данных. Первые четыре являются наиболее важными, поэтому давайте посмотрим, как их применять.
Ш аг 2: Параметр поля
Первый параметр — это Field. Для параметра Field мы указываем число, которое является номером столбца, к которому будет применяться фильтр. Это номер столбца в диапазоне фильтра, который является родителем метода AutoFilter. Это НЕ номер столбца на рабочем листе.
В приведенном ниже примере поле 4 является столбцом «Продукт», поскольку это 4-й столбец в диапазоне фильтра / таблице.
Фильтр столбца очищается, когда мы указываем только параметр Field, а другие критерии отсутствуют.
Мы также можем использовать переменную для параметра Field и установить ее динамически. Я объясню это более подробно ниже.
Ш аг 3: Параметры критериев
Существует два параметра, которые можно использовать для указания фильтра Критерии, Criteria1 и Criteria2 . Мы используем комбинацию этих параметров и параметра Operator для разных типов фильтров. Здесь все становится сложнее, поэтому давайте начнем с простого примера.
‘Фильтровать столбец «Продукт» для одного элемента
lo.Range.AutoFilter Field:=4, Criteria1:=»Product 2″
Это то же самое, что выбрать один элемент из списка флажков в раскрывающемся меню фильтра.
О бщие правила для Criteria1 и Criteria2
Значения, которые мы указываем для Criteria1 и Criteria2, могут быть хитрыми. Вот несколько общих рекомендаций о том, как ссылаться на значения параметра Criteria.
- Значением критерия является строка, заключенная в кавычки. Есть несколько исключений, когда критерии являются постоянными для периода времени даты и выше / ниже среднего.
- При указании фильтров для отдельных чисел или дат форматирование чисел должно соответствовать форматированию чисел, применяемому в диапазоне / таблице.
- Оператор сравнения больше / меньше чем также включен в кавычки перед числом.
- Кавычки также используются для фильтров для пробелов «=» и не пробелов «<>».
‘Фильтр на дату, большую или равную 1 января 2015 г.
lo.Range.AutoFilter Field:=1, Criteria1:=»>=1/1/2015″
‘ Оператор сравнения> = находится внутри кавычек
‘ для параметра Criteria1.
‘ Форматирование даты в коде соответствует форматированию
‘ применяется к ячейкам на листе.
Ш аг 4: Параметр оператора
Что если мы хотим выбрать несколько элементов из раскрывающегося списка фильтров? Или сделать фильтр для диапазона дат или чисел?
Для этого нам нужен Operator . Параметр Operator используется для указания типа фильтра, который мы хотим применить. Он может варьироваться в зависимости от типа данных в столбце. Для
Operator должна использоваться одна из следующих 11 констант.
Вот ссылка на страницу справки MSDN, которая содержит список констант для перечисления XlAutoFilterOperator .
Operator используется в сочетании с Criteria1 и / или Criteria2, в зависимости от типа данных и типа фильтра. Вот несколько примеров.
‘Фильтр для списка нескольких элементов, оператор — xlFilterValues
Criteria1:=Array(«Product 4», «Product 5», «Product 6»), _
‘Фильтр для диапазона дат (между датами), оператор xlAnd
Это основы написания строки кода для метода AutoFilter. Будет сложнее с различными типами данных.
Итак, я привел много примеров ниже, которые содержат большинство комбинаций критериев и операторов для разных типов фильтров.
А втофильтр не является дополнением
При запуске строки кода автофильтра сначала удаляются все фильтры, примененные к этому столбцу (полю), а затем применяются критерии фильтра, указанные в строке кода.
Это означает, что это не дополнение. Следующие 2 строки НЕ создадут фильтр для Продукта 1 и Продукта 2. После запуска макроса столбец Продукт будет отфильтрован только для Продукта 2.
‘Автофильтр НЕ ДОБАВЛЯЕТ. Это сначала любые фильтры, применяемые
‘в столбце перед применением нового фильтра
lo.Range.AutoFilter Field:=4, Criteria1:=»Product 3″
‘Эта строка кода отфильтрует столбец только для продукта 2
‘Фильтр для Продукта 3 выше будет очищен при запуске этой линии.
lo.Range.AutoFilter Field:=4, Criteria1:=»Product 2″
Если вы хотите применить фильтр с несколькими критериями к одному столбцу, вы можете указать это с помощью параметров
Criteria и Operator .
К ак установить номер поля динамически
Если мы добавим / удалим / переместим столбцы в диапазоне фильтра, то номер поля для отфильтрованного столбца может измениться. Поэтому я стараюсь по возможности избегать жесткого кодирования числа для параметра Field.
Вместо этого мы можем использовать переменную и использовать некоторый код, чтобы найти номер столбца по его имени. Вот два примера для обычных диапазонов и таблиц.
‘Методы, чтобы найти и установить поле на основе имени столбца.
Dim lo As ListObject
Dim iCol As Long
‘Установить ссылку на первую таблицу на листе
Set lo = Sheet1.ListObjects(1)
‘Установить поле фильтра
‘Использовать функцию соответствия для регулярных диапазонов
‘iCol = WorksheetFunction.Match(«Product», Sheet1.Range(«B3:G3»), 0)
‘Использовать переменную для значения параметра поля
lo.Range.AutoFilter Field:=iCol, Criteria1:=»Product 3″
Номер столбца будет найден при каждом запуске макроса. Нам не нужно беспокоиться об изменении номера поля при перемещении столбца. Это экономит время и предотвращает ошибки (беспроигрышный вариант)!
И спользуйте таблицы Excel с фильтрами
Использование таблиц Excel дает множество преимуществ, особенно при использовании метода автофильтрации. Вот несколько основных причин, по которым я предпочитаю таблицы.
- Нам не нужно переопределять диапазон в VBA, поскольку диапазон данных изменяет размер (строки / столбцы добавляются / удаляются). На всю таблицу ссылается объект ListObject.
- Данные в таблице легко ссылаться после применения фильтров. Мы можем использовать свойство DataBodyRange для ссылки на видимые строки для копирования / вставки, форматирования, изменения значений и т.д.
- Мы можем иметь несколько таблиц на одном листе и, следовательно, несколько диапазонов фильтров. С обычными диапазонами у нас может быть только один отфильтрованный диапазон на лист.
- Код для очистки всех фильтров в таблице легче написать.
Ф ильтры и типы данных
Параметры раскрывающегося меню фильтра изменяются в зависимости от типа данных в столбце. У нас есть разные фильтры для текста, чисел, дат и цветов. Это создает МНОГО различных комбинаций операторов и критериев для каждого типа фильтра.
Я создал отдельные посты для каждого из этих типов фильтров. Посты содержат пояснения и примеры кода VBA.
- Как очистить фильтры с помощью VBA
- Как отфильтровать пустые и непустые клетки
- Как фильтровать текст с помощью VBA
- Как фильтровать числа с помощью VBA
- Как отфильтровать даты с помощью VBA
- Как отфильтровать цвета и значки с помощью VBA
Файл в разделе загрузок выше содержит все эти примеры кода в одном месте. Вы можете добавить его в свою личную книгу макросов и использовать макросы в своих проектах.
П очему метод автофильтрации такой сложный?
Этот пост был вдохновлен вопросом от Криса, участника The VBA Pro Course. Комбинации Критерии и Операторы могут быть запутанными и сложными. Почему это?
Ну, фильтры развивались на протяжении многих лет. Мы увидели много новых типов фильтров, представленных в Excel 2010, и эта функция продолжает улучшаться. Однако параметры метода автофильтра не изменились. Они отлично подходят для совместимости со старыми версиями, но также означает, что новые типы фильтров работают с существующими параметрами.
Большая часть кода фильтра имеет смысл, но сначала может быть сложно разобраться. К счастью, у нас есть макро рекордер, чтобы помочь с этим.
Я надеюсь, что вы можете использовать эту статью и файл Excel в качестве руководства по написанию макросов для фильтров. Автоматизация фильтров может сэкономить нам и нашим пользователям массу времени, особенно при использовании этих методов в более крупном проекте автоматизации данных.
Источник
Содержание
- Синтаксис автофильтра Excel VBA
- Включение и выключение автофильтра Excel с помощью VBA
- Убедитесь, что автофильтр уже применен
- Показать все данные
- Использование автофильтра на защищенных листах
Многие функции Excel также доступны для использования в VBA — и Автофильтр метод — одна из таких функций.
Если у вас есть набор данных, и вы хотите отфильтровать его по критерию, вы можете легко сделать это с помощью параметра «Фильтр» на ленте «Данные».
А если вам нужна более продвинутая версия, в Excel также есть расширенный фильтр.
Тогда зачем даже использовать автофильтр в VBA?
Если вам просто нужно отфильтровать данные и выполнить некоторые базовые действия, я бы рекомендовал придерживаться встроенных функций фильтра, которые предлагает интерфейс Excel.
Вам следует использовать VBA Autofilter, если вы хотите фильтровать данные как часть вашей автоматизации (или если это помогает вам сэкономить время, ускоряя фильтрацию данных).
Например, предположим, что вы хотите быстро отфильтровать данные на основе раскрывающегося списка, а затем скопировать эти отфильтрованные данные на новый рабочий лист.
Хотя это можно сделать с помощью встроенных функций фильтра вместе с копипастом, это может занять много времени, чтобы сделать это вручную.
В таком сценарии использование VBA Autofilter может ускорить работу и сэкономить время.
Примечание: Я расскажу об этом примере (о фильтрации данных на основе раскрывающегося списка и копировании на новый лист) позже в этом руководстве.
Выражение. Автофильтр (_Field_, _Criteria1_, _Operator_, _Criteria2_, _VisibleDropDown_)
- Выражение: Это диапазон, к которому вы хотите применить автоматический фильтр.
- Поле: [Необязательный аргумент] Это номер столбца, который вы хотите отфильтровать. Это считается слева в наборе данных. Поэтому, если вы хотите отфильтровать данные на основе второго столбца, это значение будет 2.
- Критерии1: [Необязательный аргумент] Это критерии, на основе которых вы хотите отфильтровать набор данных.
- Оператор: [Необязательный аргумент] Если вы также используете критерий 2, вы можете объединить эти два критерия на основе Оператора. Для использования доступны следующие операторы: xlAnd, xlOr, xlBottom10Items, xlTop10Items, xlBottom10Percent, xlTop10Percent, xlFilterCellColor, xlFilterDynamic, xlFilterFontColor, xlFilterIcon, xlFilterValues
- Критерии2: [Необязательный аргумент] Это второй критерий, по которому вы можете фильтровать набор данных.
- VisibleDropDown: [Необязательный аргумент] Вы можете указать, хотите ли вы, чтобы раскрывающийся значок фильтра отображался в отфильтрованных столбцах или нет. Этот аргумент может иметь значение ИСТИНА или ЛОЖЬ.
Все остальные аргументы, кроме Expression, необязательны.
Если вы не используете какой-либо аргумент, он просто применяет или удаляет значки фильтра к столбцам.
Sub FilterRows () Worksheets («Фильтр данных»). Диапазон («A1»). AutoFilter End Sub
Приведенный выше код просто применит метод автофильтра к столбцам (или, если он уже применен, удалит его).
Это просто означает, что если вы не видите значки фильтра в заголовках столбцов, вы начнете видеть его, когда будет выполнен приведенный выше код, и если вы его увидите, он будет удален.
Если у вас есть отфильтрованные данные, он удалит фильтры и покажет вам полный набор данных.
Теперь давайте посмотрим на несколько примеров использования Excel VBA Autofilter, которые прояснят его использование.
Пример: фильтрация данных на основе текстового условия
Предположим, у вас есть набор данных, показанный ниже, и вы хотите отфильтровать его на основе столбца «Элемент».
В приведенном ниже коде будут отфильтрованы все строки, в которых элементом является «Принтер».
Sub FilterRows () Worksheets ("Sheet1"). Range ("A1"). AutoFilter Field: = 2, Criteria1: = "Printer" End Sub
Приведенный выше код относится к Sheet1, а внутри него — к A1 (которая является ячейкой в наборе данных).
Обратите внимание, что здесь мы использовали Field: = 2, поскольку столбец элемента — это второй столбец в нашем наборе данных слева.
Теперь, если вы думаете — зачем мне это делать с помощью кода VBA. Это легко сделать с помощью встроенного фильтра.
Ты прав!
Если это все, что вы хотите сделать, лучше использовать встроенную функцию фильтра.
Но когда вы прочитаете оставшееся руководство, вы увидите, что его можно объединить с некоторым дополнительным кодом для создания мощной автоматизации.
Но прежде чем я покажу вам это, позвольте мне сначала рассмотреть несколько примеров, чтобы показать вам, на что способны все методы автофильтра.
кликните сюда чтобы загрузить файл с примером и следовать за ним.
Пример: несколько критериев (И / ИЛИ) в одном столбце
Предположим, у меня есть тот же набор данных, и на этот раз я хочу отфильтровать все записи, в которых элементом является «Принтер» или «Проектор».
Следующий код сделает это:
Sub FilterRowsOR () Рабочие листы ("Sheet1"). Диапазон ("A1"). Поле автофильтра: = 2, Criteria1: = "Printer", Operator: = xlOr, Criteria2: = "Projector" End Sub
Обратите внимание, что здесь я использовал XLOR оператор.
Это указывает VBA использовать оба критерия и фильтровать данные, если выполняется какой-либо из двух критериев.
Точно так же вы также можете использовать критерий И.
Например, если вы хотите отфильтровать все записи, в которых количество больше 10, но меньше 20, вы можете использовать следующий код:
Sub FilterRowsAND () Worksheets ("Sheet1"). Range ("A1"). AutoFilter Field: = 4, Criteria1: = "> 10", _ Operator: = xlAnd, Criteria2: = "<20" End Sub
Пример: несколько критериев с разными столбцами
Предположим, у вас есть следующий набор данных.
С помощью автофильтра вы можете фильтровать несколько столбцов одновременно.
Например, если вы хотите отфильтровать все записи, где элемент — «Принтер», а торговый представитель — «Отметка», вы можете использовать следующий код:
Sub FilterRows () с листами ("Sheet1"). Range ("A1") .AutoFilter field: = 2, Criteria1: = "Printer" .AutoFilter field: = 3, Criteria1: = "Mark" End with End Sub
Пример: отфильтровать 10 лучших записей с помощью метода автофильтрации
Предположим, у вас есть следующий набор данных.
Ниже приведен код, который предоставит вам 10 лучших записей (на основе столбца количества):
Sub FilterRowsTop10 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "10", оператор: = xlTop10Items End Sub
В приведенном выше коде я использовал ActiveSheet. Вы можете использовать имя листа, если хотите.
Обратите внимание, что в этом примере, если вы хотите получить 5 лучших элементов, просто измените число в Criteria1: = ”10 ″ с 10 до 5.
Итак, для топ-5 элементов код будет следующим:
Sub FilterRowsTop5 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "5", оператор: = xlTop10Items End Sub
Это может выглядеть странно, но независимо от того, сколько топовых элементов вы хотите, значение Operator всегда остается xlTop10Items.
Точно так же приведенный ниже код даст вам 10 нижних элементов:
Sub FilterRowsBottom10 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "10", оператор: = xlBottom10Items End Sub
А если вам нужны 5 нижних элементов, измените число в Criteria1: = ”10 ″ с 10 до 5.
Пример: отфильтруйте 10 процентов лучших с помощью метода автофильтрации
Предположим, у вас есть тот же набор данных (который использовался в предыдущих примерах).
Ниже приведен код, который предоставит вам первые 10 процентов записей (в зависимости от столбца количества):
Sub FilterRowsTop10 () ActiveSheet.Range ("A1"). Поле автофильтра: = 4, Criteria1: = "10", оператор: = xlTop10Percent End Sub
В нашем наборе данных, поскольку у нас есть 20 записей, он вернет 2 верхние записи (что составляет 10% от общего числа записей).
Пример: использование подстановочных знаков в автофильтре
Предположим, у вас есть набор данных, как показано ниже:
Если вы хотите отфильтровать все строки, в названии которых есть слово «Доска», вы можете использовать следующий код:
Sub FilterRowsWildcard () Worksheets ("Sheet1"). Range ("A1"). AutoFilter Field: = 2, Criteria1: = "* Board *" End Sub
В приведенном выше коде я использовал подстановочный знак * (звездочку) до и после слова «Доска» (которое является критерием).
Звездочка может представлять любое количество символов. Таким образом, это отфильтрует любой элемент, в котором есть слово «доска».
Пример: копирование отфильтрованных строк на новый лист
Если вы хотите не только фильтровать записи на основе критериев, но и копировать отфильтрованные строки, вы можете использовать следующий макрос.
Он копирует отфильтрованные строки, добавляет новый лист, а затем вставляет эти скопированные строки в новый лист.
Sub CopyFilteredRows () Dim rng As Range Dim ws As Worksheet If Worksheets ("Sheet1"). AutoFilterMode = False Then MsgBox "Нет отфильтрованных строк" Выйти из Sub End, если установлено rng = Worksheets ("Sheet1"). AutoFilter.Range Set ws = Worksheets.Add rng.Copy Range ("A1") End Sub
Приведенный выше код проверяет, есть ли отфильтрованные строки в Sheet1 или нет.
Если нет отфильтрованных строк, отобразится сообщение об этом.
И если есть отфильтрованные строки, он скопирует их, вставит новый рабочий лист и вставит эти строки на этот только что вставленный рабочий лист.
Пример: фильтрация данных на основе значения ячейки
Используя автофильтр в VBA вместе с раскрывающимся списком, вы можете создать функцию, в которой, как только вы выберете элемент из раскрывающегося списка, все записи для этого элемента будут отфильтрованы.
Что-то вроде того, что показано ниже:
кликните сюда чтобы загрузить файл с примером и следовать за ним.
Этот тип конструкции может быть полезен, когда вы хотите быстро отфильтровать данные, а затем использовать их в дальнейшей работе.
Ниже приведен код, который это сделает:
Private Sub Worksheet_Change (ByVal Target As Range) Если Target.Address = "$ B $ 2", то если Range ("B2") = "All", то диапазон ("A5"). AutoFilter Else Range ("A5"). AutoFilter Field : = 2, Criteria1: = Range ("B2") End If End If End Sub
Это код события рабочего листа, который выполняется только тогда, когда на листе есть изменение, а целевая ячейка — B2 (где у нас есть раскрывающийся список).
Кроме того, условие If Then Else используется для проверки, выбрал ли пользователь «Все» в раскрывающемся списке. Если выбрано «Все», отображается весь набор данных.
Этот код НЕ помещается в модуль.
Вместо этого его нужно поместить в серверную часть рабочего листа, на котором есть эти данные.
Вот шаги, чтобы поместить этот код в окно кода рабочего листа:
- Откройте редактор VB (сочетание клавиш — ALT + F11).
- На панели Project Explorer дважды щелкните имя рабочего листа, в котором вы хотите использовать эту функцию фильтрации.
- В окне кода рабочего листа скопируйте и вставьте приведенный выше код.
- Закройте редактор VB.
Теперь, когда вы используете раскрывающийся список, он автоматически фильтрует данные.
Это код события рабочего листа, который выполняется только тогда, когда на листе есть изменение, а целевая ячейка — B2 (где у нас есть раскрывающийся список).
Кроме того, условие If Then Else используется для проверки, выбрал ли пользователь «Все» в раскрывающемся списке. Если выбрано «Все», отображается весь набор данных.
Включение и выключение автофильтра Excel с помощью VBA
При применении автофильтра к диапазону ячеек некоторые фильтры могут уже быть на месте.
Вы можете использовать приведенный ниже код, чтобы отключить любые предварительно примененные автоматические фильтры:
Sub TurnOFFAutoFilter () Worksheets ("Sheet1"). AutoFilterMode = False End Sub
Этот код проверяет все листы и удаляет все примененные фильтры.
Если вы не хотите отключать фильтры для всего листа, а только для определенного набора данных, используйте следующий код:
Sub TurnOFFAutoFilter () Если рабочие листы ("Sheet1"). Range ("A1"). AutoFilter Then Worksheets ("Sheet1"). Range ("A1"). AutoFilter End If End Sub
Приведенный выше код проверяет, установлены ли уже фильтры или нет.
Если фильтры уже применены, он их удаляет, иначе ничего не делает.
Точно так же, если вы хотите включить автофильтр, используйте следующий код:
Sub TurnOnAutoFilter (), если не рабочие листы ("Sheet1"). Range ("A4"). AutoFilter Then Worksheets ("Sheet1"). Range ("A4"). AutoFilter End If End Sub
Убедитесь, что автофильтр уже применен
Если у вас есть лист с несколькими наборами данных, и вы хотите убедиться, что вы знаете, что фильтры уже не установлены, вы можете использовать приведенный ниже код.
Sub CheckforFilters () Если ActiveSheet.AutoFilterMode = True Then MsgBox "Фильтры уже установлены" Else MsgBox "Фильтры отсутствуют" End If End Sub
Этот код использует функцию окна сообщения, которая отображает сообщение «Фильтры уже установлены», когда он находит фильтры на листе, в противном случае он показывает «Нет фильтров».
Показать все данные
Если у вас есть фильтры, примененные к набору данных, и вы хотите показать все данные, используйте приведенный ниже код:
Sub ShowAllData () Если ActiveSheet.FilterMode, то ActiveSheet.ShowAllData End Sub
Приведенный выше код проверяет, имеет ли FilterMode значение TRUE или FALSE.
Если это правда, это означает, что был применен фильтр и он использует метод ShowAllData для отображения всех данных.
Обратите внимание, что это не удаляет фильтры. Значки фильтров по-прежнему доступны для использования.
Использование автофильтра на защищенных листах
По умолчанию, когда вы защищаете лист, фильтры не работают.
Если у вас уже есть фильтры, вы можете включить автофильтр, чтобы убедиться, что он работает даже на защищенных листах.
Для этого отметьте опцию Использовать автофильтр при защите листа.
Хотя это работает, когда у вас уже есть фильтры, если вы попытаетесь добавить автофильтры с помощью кода VBA, это не сработает.
Поскольку лист защищен, он не позволит запускать какие-либо макросы и вносить изменения в автофильтр.
Поэтому вам нужно использовать код, чтобы защитить рабочий лист и убедиться, что в нем включены автоматические фильтры.
Это может быть полезно, когда вы создали динамический фильтр (то, что я рассмотрел в примере — «Фильтровать данные на основе значения ячейки»).
Ниже приведен код, который защитит лист, но в то же время позволит вам использовать в нем фильтры, а также макросы VBA.
Private Sub Workbook_Open () With Worksheets ("Sheet1") .EnableAutoFilter = True .Protect Password: = "password", Contents: = True, UserInterfaceOnly: = True End with End Sub
Этот код необходимо поместить в окно кода ThisWorkbook.
Вот шаги, чтобы поместить код в окно кода ThisWorkbook:
- Откройте редактор VB (сочетание клавиш — ALT + F11).
- На панели Project Explorer дважды щелкните объект ThisWorkbook.
- В открывшемся окне кода скопируйте и вставьте приведенный выше код.
Как только вы откроете книгу и включите макросы, он автоматически запустит макрос и защитит Sheet1.
Однако перед этим он укажет EnableAutoFilter = True, что означает, что фильтры будут работать и на защищенном листе.
Кроме того, он устанавливает для аргумента UserInterfaceOnly значение True. Это означает, что пока рабочий лист защищен, код макроса VBA будет продолжать работать.
Вам также могут понравиться следующие руководства по VBA:
- Циклы Excel VBA.
- Отфильтруйте ячейки с полужирным шрифтом.
- Запись макроса.
- Сортировка данных с помощью VBA.
- Сортировка вкладок рабочего листа в Excel.