Advancedfilter vba excel описание

In this Article

  • Advanced Filter Syntax
  • Filtering Data In Place
  • Resetting the data
  • Filtering Unique Values
  • Using the CopyTo argument
  • Removing Duplicates from the data

This tutorial will explain the how to use the Advanced Filter method in VBA

Advanced Filtering in Excel is very useful when dealing with large quantities of data where you want to apply a variety of filters at the same time.  It can also be used to remove duplicates from your data.  You need to be familiar with creating an Advanced Filter in Excel before attempting to create an Advanced Filter from within VBA.

Consider the following worksheet.

vba advanced filtering database

You can see at a glance that there are duplicates that you might wish to remove.  The Type of account is a mixture of Saving, Term Loan and Check.

First you need to set up a criteria section for the advanced filter.  You can do this in a separate sheet.

vba advanced filtering criteriasheet

For ease of reference, I have named my data sheet ‘Database’ and my criteria sheet ‘Criteria’.

Advanced Filter Syntax

Expression.AdvancedFilter Action, CriteriaRange, CopyToRange, Unique

vba advanced filtering syntax

  • The Expression represents the range object – and can be set as a Range (eg Range(“A1:A50”) – or the Range can be assigned to a variable and that variable can be used.
  • The Action argument is required and will either be xlFilterInPlace or xlFilterCopy
  • The Criteria Range argument  is where you are getting the Criteria to filter from (our Criteria sheet above).  This is optional as you would not need a criteria if you were filtering for unique values for example.
  • The CopyToRange argument  is where you are going to put your filter results – you can filter in place or you can have your filter result copied to an alternative location.  This is also an optional argument.
  • The Unique argument is also optional – True is to filter on unique records only, False is to filter on all the records that meet the criteria – if you omit this, the default will be False.

Filtering Data In Place

Using the criteria shown above in the criteria sheet – we want to find all the accounts with a type of ‘Savings’ and ‘Current’.   We are filtering in place.

Sub CreateAdvancedFilter()
   Dim rngDatabase As Range
   Dim rngCriteria As Range
'define the database and criteria ranges
   Set rngDatabase = Sheets("Database").Range("A1:H50")
   Set rngCriteria = Sheets("Criteria").Range("A1:H3")
'filter the database using the criteria
   rngDatabase.AdvancedFilter xlFilterInPlace, rngCriteria
End Sub

vba advanced filtering in place

The code will hide the rows that do not meet the criteria.

In the above VBA procedure, we did not include the CopyToRange or Unique arguments.

Resetting the data

Before we run another filter, we have to clear the current one.  This will only work if you have filtered your data in place.

Sub ClearFilter()
   On Error Resume Next
'reset the filter to show all the data
   ActiveSheet.ShowAllData
End Sub

Filtering Unique Values

In the procedure below, I have included the Unique argument but omitted the CopyToRange argument.  If you leave this argument out, you EITHER have to put a comma as a place holder for the argument

Sub UniqueValuesFilter1()
   Dim rngDatabase As Range
   Dim rngCriteria As Range
'define the database and criteria ranges
   Set rngDatabase = Sheets("Database").Range("A1:H50")
   Set rngCriteria = Sheets("Criteria").Range("A1:H3")
'filter the database using the criteria
   rngDatabase.AdvancedFilter xlFilterInPlace, rngCriteria,,True
End Sub

OR you need to use named arguments as shown below.

Sub UniqueValuesFilter2()
   Dim rngDatabase As Range
   Dim rngCriteria As Range
'define the database and criteria ranges
   Set rngDatabase = Sheets("Database").Range("A1:H50")
   Set rngCriteria = Sheets("Criteria").Range("A1:H3")
'filter the database using the criteria
   rngDatabase.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rngCriteria, Unique:=True
End Sub

Both of the code examples above will run the same filter, as shown below – the data with only unique values.

vba advanced filtering unique

Using the CopyTo argument

Sub CopyToFilter() 
   Dim rngDatabase As Range 
   Dim rngCriteria As Range 
'define the database and criteria ranges 
   Set rngDatabase = Sheets("Database").Range("A1:H50") 
   Set rngCriteria = Sheets("Criteria").Range("A1:H3") 
'copy the filtered data to an alternative location
    rngDatabase.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=rngCriteria, CopyToRange:=Range("N1:U1"), Unique:=True
End Sub

Note that we could have omitted the names of the arguments in the Advanced Filter line of code, but using named arguments does make the code easier to read and understand.

This line below is identical to the line in the procedure shown above.

rngDatabase.AdvancedFilter xlFilterCopy, rngCriteria, Range("N1:U1"), True

Once the code is run, the original data is still shown with the filtered data shown in the destination location specified in the procedure.

vba advanced filtering copy to location

Removing Duplicates from the data

We can remove duplicates from the data by omitting the Criteria argument, and copying the data to a new location.

Sub RemoveDuplicates()
   Dim rngDatabase As Range
'define the database
   Set rngDatabase = Sheets("Database").Range("A1:H50")
'filter the database to a new range with unique set to true
rngDatabase.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("N1:U1"), Unique:=True
End Sub

vba filtering remove duplicates

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

VBA Advanced Filter is one of the many hidden gems that Excel VBA offers to make our time more productive.

VBA Advanced Filter requires very little code, is one of the fastest ways to copy data, and provides advanced filtering options that we cannot get anywhere else.

VBA Advanced Filter Quick Guide

Using the criteria with AdvancedFilter is very powerful. You can see the possible options in the table below:

Task Cell formula Examples where true
Contains Pea
=»Pea»
=»*Pea*»
Peach, Pea, Appear
Does not contain =»<>*Pea*» any text that does not contain Pea
Exact match =»=Pea» Pea
Does not exactly match =»<>Pea» Peach, Pear etc.
Starts with =»=Pea*» Peach, Pear, Pea
Ends with =»=*Pea» SweetPea, GreenPea
Use the ? symbol to represent any single character =»=Pea?» Pear, Peas or any 4 letter word starting with «Pea»
Any of the symbols *?~ =»=Pea~*» Pea*, Pea?
Case sensitive(see section Using Formulas as Criteria) =EXACT(A7,»Peach») Peach
Greater than =»>700″ 701,702 etc.
Greater than or equals =»>=700″ 700, 701,702 etc.
Less than =»<700″ 699,698 etc.
Less than or equals =»<=700″ 700, 699, 698 etc.
Equals =»=700″ 700

Important Note: A Criteria column header must exist as a List range column header. For example, if the Criteria column header is “Fruit” then there must be a List range column header called “Fruit”.

Here are some important things to know about the Criteria column headers:

  • They can be used in any order.
  • You can use the same header multiple times(see section Advanced Filter Multiple Criteria below).
  • You don’t need to include a column header in the criteria if you are not filtering by this column.

What is Advanced Filter

Advanced Filter is a tool that is available in the Sort & Filter  section of the Data tab on the Excel Ribbon:

It allows us to filter data based on a Criteria range. This allows us to do more advanced filtering than the standard filtering on the worksheet.

A second advantage of using Advanced Filter is that we have the option to copy the results to a new range if we choose.

Using Advanced Filter is quite simple as you can see from the dialog:

We filter in-place or we copy to another location.  We then simply need the data range(List range) and the Criteria Range. If we decided to copy to another location then we provide the “Copy to” range.

Using Advanced Filter is very useful in VBA because it is extremely fast, powerful and as we will see it requires very little code.

VBA Advanced Filter on YouTube

To see me working with Advanced Filter, check out this YouTube video:

VBA Advanced Filter Parameters

The following table shows the parameters of the AdvancedFilter function:

Parameter Optional Type Details
Action Required xlFilterAction xlFilterInPlace or xlFilterCopy.
CriteriaRange Optional Range Range of the criteria used for filtering the data.
CopyToRange Optional Range Destination range if Action is set to xlFilterCopy.
Unique Optional Boolean True for unique records only.

You can read about the parameters on the Microsoft help page.

AdvancedFilter requires three ranges to run(or two if you are using xlFilterInPlace as the Action parameter):

  1. List range – data to filter.
  2. Criteria range – how to filter.
  3. Copy To range – where to place the results if the Action parameter is set to xlFilterCopy is set.

AdvancedFilter is a range Function. This means you get the range of data you wish to filter and then call the AdvancedFilter function of that range:

 DataRange.AdvancedFilter Filter Action, Criteria, [CopyTo], [Unique]

We can filter in place or we can copy the filter results to another location. This means there are two ways to use AdvancedFilter:

 ' Filter in place
 rgData.AdvancedFilter xlFilterInPlace, rgCriteriaRange

 ' Filter and copy data
 rgData.AdvancedFilter xlFilterCopy, rgCriteriaRange, rgDestination

The first parameter indicates the way to apply the filter:

  1. xlFilterInPlace – Filter the original data.
  2. xlFilterCopy – Copy the filter results to a new range.

If we use xlFilterInPlace then we don’t need the destination range.

To remove duplicate records we simply set the Unique parameter to True. Otherwise, duplicate records are ignored:

 ' Filter in place
 rgData.AdvancedFilter xlFilterInPlace, rgCriteriaRange, , True 

 ' Filter and copy data
 rgData.AdvancedFilter xlFilterCopy, rgCriteriaRange, rgDestination, True 

Understanding the Advanced Filter Ranges

The following screenshot shows an example of the 3 ranges. The List(or data) range is shaded blue, the Criteria range is green, and the CopyTo range is yellow:

Advanced filter ranges

The following subsection provides a quick guide to each of the ranges:

Criteria Range

  • The criteria headers must be one of the List Range column headers. If not then it will be ignored.
  • Criteria headers can be in any order.
  • You can include as many or as few Criteria headers as you need.
  • You can use the same header multiple times – this allows us to do multiple AND operations on the same column.

CopyTo Range

  • This range is only used when the Action parameter is set to xlFilterCopy.
  • To avoid errors this range should be the Header row of the output destination.
  • You can use any(or all) columns from the List range as your output and they can be in any order.
  • The columns headers in this range must be a List Range column header or you will get a VBA Runtime Error 1004.

List Range

  • The List Range is the range of data that will be filtered.
  • You must include the headers as part of the List Range.
  • If you set the Action parameter to xlFilterInPlace then the List data will be filtered.
  • If you set the Action parameter to xlFilterCopy then the results will be copied to the location which is specified in the CopyToRange parameter.

Writing the VBA Code

The easiest way to define the data range is to use CurrentRegion although you can get the range any way you like.  Using CurrentRegion gets all the adjacent data to the specified cell or range.

We can use CurrentRegion like this:

 Dim rgData As Range, rgCriteriaRange As Range
 Set rgData = Range("A4").CurrentRegion
 Set rgCriteriaRange = Range("A1").CurrentRegion

To set the CopyTo range, you specify the entire heading row.

You can use a simple trick with CurrentRegion to get the CopyToRange header row. First, use CurrentRegion and then take the first row of the resulting range:

 Dim rgCopyToRange As Range
 Set rgCopyToRange = shFruit.Range("E4").CurrentRegion.Rows(1)

The full VBA Advanced filter code looks like this:

Sub RunAdvancedFilter()

    ' Declare the variables
    Dim rgData As Range, rgCriteriaRange As Range, rgCopyToRange As Range
    
    ' Set the ranges
    Set rgData = Sheet1.Range("A4").CurrentRegion
    Set rgCriteriaRange = Sheet1.Range("A1").CurrentRegion
    Set rgCopyToRange = Sheet1.Range("D1").CurrentRegion.Rows(1)
    
    ' Run AdvancedFilter
    rgData.AdvancedFilter xlFilterCopy, rgCriteriaRange, rgCopyToRange  

End Sub

You can run this code for pretty much any AdvancedFilter that you want to do. All you need to do is to change the ranges as appropriate. You can change Sheet1 in the code to any worksheet variable or code name.

Important Note: When we run AdvancedFilter using VBA, the ranges do not need to be on the same worksheet or even in the same workbook.

VBA Advanced Filter Clear

If we Filter the data in place then we can use ShowAllData to remove the filter. We should check the filter is turned on first so we don’t get an error. We can use the following code to check and clear the filter if it exists:

If Sheet1.FilterMode = True Then
    Sheet1.ShowAllData
End If

If we are we filter using copy then Advanced Filter will automatically remove existing data from the destination before copying. However, if you want to simply clear the data you can do it like this:

    Sheet1.Range("E7").CurrentRegion.Offset(1).ClearContents

This highlights all the adjacent data to the output headers. It moves down one row using Offset to avoid clearing the header row.

VBA Advanced Filter Criteria

Check out this YouTube video to see me using Advanced Filter Criteria:

To use Criteria on a filter we use the columns headers of the List range with the criteria below them.  The following criteria will return all rows where the Fruit column contains the text Orange:

This criteria will return the following rows:

Advanced Filter Multiple Criteria

We can use the columns in any row to filter by multiple criteria. This allows us to filter using AND logic e.g. If Fruit equals “Apple” AND City equals “New York”:

We can use multiple rows if we want to filter using OR logic e.g. If Fruit equals “Apple” OR Fruit equals “Pear” OR Fruit equals “Plum”:

Let’s have a look at examples of using Multiple Criteria with Advanced Filter:

Advanced Filter Multiple Criteria Examples

In our first example we will start with a simple AND filter:

Advanced filter criteria and

These criteria return all the rows that have the fruit Orange AND the city Berlin:

Advanced filter data and results

In our next example, we are looking for a city that starts with S AND has sales of less than 500:

These criteria will return the following rows:

We can use any column header multiple times in the criteria range. For example, we can use the Sales column twice to get a number between 300 and 500:

These criteria will return the following rows:

Advanced Filter Criteria – OR

We use columns in a row when we want to do an AND operation. If we want want to do an OR operation we use rows in the Criteria filter.

In the following example we want to return rows where the Fruit is either a Peach OR a Banana:

This will return the following rows:

In the following example, we want to return any rows that have a fruit Banana OR sales that are greater than 900:

These criteria will return the following rows:

Combining AND Criteria and OR Criteria

Let’s look at an example of combining AND criteria with OR criteria.

This criteria filters by rows where (Fruit is Lemon AND City is Singapore) OR (Fruit is Orange AND City is Paris):

These are the results:

Using Formulas as Criteria

While the standard criteria methods offer powerful filtering methods they have limitations. The beauty of the AdvancedFilter is that we can use worksheet formulas in the criteria.

There are 3 rules when using formulas in the criteria range:

  1. No heading.
  2. The formula must result in True or False.
  3. The formula should reference the first row of the data range.

Imagine we have the following data:

We want to filter by games where the total number of goals scored was 2. We cannot do this using the normal criteria so we create a formula:

=B5+D5=2

We place this formula in cell A2:

You can see that we have followed the rules above:

  1. We have no header in the criteria.
  2. The result of the formula is False.
  3. The formula refers to the first row of the data i.e. B5 and D5.

The rows we get back are:

Note: If we want to use a formula on another row in the Criteria we should still refer to the first row of the data e.g.:

Cell A2 formula: =B5+D5=2

Cell A3 formula: =B5+D5=5

Cell A3 formula: =B5+D5=7

Advanced Filter Case Sensitive Criteria

There isn’t a simple way to use case sensitivity in our Criteria therefore we use a formula instead:

=EXACT(A5, “Pea”)

Make sure to follow the Formula rules in the previous section to ensure this works correctly.

VBA Advanced Filter Dates

Take a look at the following formula for the date criteria:

=”<1/9/2021″

This formula will work fine when we run Advanced Filter from the ribbon. But if we run Advanced Filter using VBA it will not return any records.

Instead, we have to use a formula like this:

=”<” & DATE(2021,9,1)

When we use this in the criteria like this:

we get:

If you want to do between dates then you can use the formulas in two columns. For example, imagine we want to get all the records in August 2021, then we can use the following formulas:

A2: =”<=” & DATE(2021,8,31)

B2: =”>=” & DATE(2021,8,1)

This will return the following rows:

VBA Advanced Filter Advantages and Limitations

Advanced Filter is easy to use and does its job very well. However, like every tool it has advantages and limitations to what it can do.

The following are the advantages of using the Advanced Filter:

  1. Speed – It is the fastest VBA method for copying and filtering data although multiple calls will slow it down.
  2. Advanced filtering – provides in-depth filtering options including the use of formulas.
  3. Requires very little code – You can use the same code most of the time and it’s simplistic compared to other methods of copying and filtering code in VBA.
  4. Formatting – When copying the results it automatically formats the result data to match the original data.

The following are the limitations of the Advanced Filter which you should be aware of:

  1. Speed – using AdvancedFilter is extremely fast but calling it multiple times in the same code, will cause it to run slower.
  2. Criteria can only use ranges – you cannot use an array for the Criteria. The workaround is to write the array to a range and then use it as the Criteria.
  3. Cannot alter data – AdvancedFilter simply filters and copies the data. You cannot make changes to the data after filtering and before copying.
  4. Cannot append data – To append data you need to write extra code.

Error 1004 – Extract Range

The most common error with the advanced filter is: Error 1004 – the extract range has a missing or invalid field name.

VBA Runtime Error 1004 occurs when one or more of the output column headers do not exist in the original data as we can see in this example:

If this error occurs you should ensure that the CopyTo range has the correct column headers with the correct spelling and that it is referencing the correct range.

What to do if Advanced Filter is not working

In general, when Advanced Filter throws an error, the problem is in one of the ranges.

If you have an error the following checks should fix most if not all errors:

  1. Ensure all the range variables are referencing the expected ranges.
  2. Ensure the Criteria and CopyTo column headers are correctly spelled and exist in the column headers of the List range.
  3. Ensure that the CopyTo range references the header row only.
  4. Ensure that any Criteria columns using formulas do not have a header.
  5. Make sure that there are no trailing spaces in Criteria.

TIP: If you are debugging the code you can check any range using the Address property of the range:

Wrapping Up

In this post, we’ve seen how to configure the ranges in a worksheet to be able to use Advanced Filter. We’ve also seen how, with a few lines of VBA code, we can take advantage of the power and speed of this function to filter and copy data.

We’ve also seen how to use the criteria to apply simple and complex filters and how to proceed when an error prevents us from using Advanced Filter.

Leave your comments if you want to know more about this powerful tool Excel gives us. Or if you’ve run into problems that prevent you from unleashing all its power.

What’s Next?

Free VBA Tutorial If you are new to VBA or you want to sharpen your existing VBA skills then why not try out this Free VBA Tutorial.

Related Training: Get full access to the Excel VBA training webinars and all the tutorials.

(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)

Содержание

  1. Advancedfilter vba excel описание
  2. Range.AdvancedFilter method (Excel)
  3. Syntax
  4. Parameters
  5. Return value
  6. Example
  7. Support and feedback
  8. Расширенный фильтр VBA
  9. Расширенный синтаксис фильтра
  10. Фильтрация данных на месте
  11. Сброс данных
  12. Фильтрация уникальных значений
  13. Использование аргумента CopyTo
  14. Удаление дубликатов из данных
  15. Метод Range.AdvancedFilter (Excel)
  16. Синтаксис
  17. Параметры
  18. Возвращаемое значение
  19. Пример
  20. Поддержка и обратная связь

Advancedfilter vba excel описание

На этом шаге мы рассмотрим назначение и пример использования этого метода .

Метод AdvancedFilter (Расширенный фильтр) является более мощным и универсальным средством фильтрации, чем метод AutoFilter . Он позволяет использовать фильтрацию по большему числу критериев, причем допустимо применение критериев, включающих формулы. Кроме того, метод AdvancedFilter позволяет фильтровать список с выводом результата фильтрации как непосредственно на том месте, где он расположен, так и в новое специфицированное место. Вручную метод запускается посредством выбора команды Данные | Фильтр | Расширенный фильтр (Data | Filter | Advanced Filter) .

Аргумент Назначение
Action Допустимые значения:: xlFilterInPiace (фильтровать список на месте) и xlFilterCopy (скопировать результат на новое место)
CriteriaRange Ссылка на диапазон с критериями
CopyToRange Если параметр Action принимает значение xlFilterCору , то он указывает диапазон, куда будет копироваться результат фильтрации
Unique Допустимые значения: True (отбирается только один вариант записи из многократно встречающихся в списке) и False (отбираются все встречающиеся записи)

Таблица 1. Аргументы метода AdvancedFilter

Приведем соответствие между аргументами метода AdvancedFilter и выполнением команды Данные | Фильтр | Расширенный фильтр (Data | Filter | Advanced Filter) при фильтрации базы данных регистрации туристов.

    Выделяем диапазон A1:G13 , содержащий фильтруемую базу данных (рисунок 1).

Рис.1. Фильтруемый список

Прежде чем выбирать команду Данные | Фильтр | Расширенный фильтр (Data | Filter | Advanced Filter) , необходимо выполнить предварительные построения по созданию диапазона критериев. Верхняя строка диапазона критериев должна содержать заголовки полей фильтруемых данных. При этом нет необходимости включать все заголовки и сохранять их порядок. В диапазон критериев также должны входить строки с условиями фильтрации. Все условия в диапазоне критериев, записанные под заголовком поля, относятся к этому полю. При применении расширенного фильтра допустима запись нескольких условий в строке диапазона критериев. Условия, расположенные в одной строке, рассматриваются как условия, объединенные логической операцией И (And) , а расположенные в нескольких — логической операцией ИЛИ (Or) . В данном случае под диапазон критериев отведем диапазон A16:G17 . В базе данных выберем записи обо всех мужчинах, которые едут в Лондон. С этой целью в ячейку С17 диапазона критериев введем значение муж , а в ячейку D17 — Лондон .
Выберем команду Данные | Фильтр | Расширенный фильтр (Data | Filter | Advanced Filter) . Появится диалоговое окно Расширенный фильтр (Advanced Filter) (рисунок 2).

Рис.2. Диалоговое окно Расширенный фильтр

  • Переключатели группы Обработка (Action) определяют, где будут располагаться отфильтрованные данные. В рассматриваемом случае не будем фильтровать список на месте, а скопируем результат фильтрации в другое место. Поэтому выберем переключатель Скопировать результат в другое место (Copy to Another Location) . У метода AdvancedFilter за выбор местоположения результата фильтрации отвечает аргумент Action . При данном выборе переключателя аргументу Action присваивается значение xlFilterCopy .
  • В поле Исходный диапазон (List Range) вводится ссылка на диапазон с фильтруемыми данными — A1:G13 . В поле Диапазон условий (Criteria Range) вводится ссылка на диапазон с критериями — A16:G17 . У метода AdvancedFilter определение диапазона с критериями осуществляется с помощью аргумента CriteriaRange . Поэтому ему присваивается диапазон Range(«A16:G17») .
  • В поле Поместить результат в диапазон (Copy to) дается ссылка на диапазон назначения. В данном случае A19:G19 . Переменной в методе AdvancedFilter , отвечающей за диапазон назначения, является CopyToRange . Поэтому ей надо присвоить диапазон Range(«A19:G19») .
  • Флажок Только уникальные записи (Unique Records Only) определяет, будут ли отображаться все отфильтрованные записи или только по одной из всех одинаковых записей, удовлетворяющих критерию. В данном случае снимем флажок Только уникальные записи (Unique Records Only) . Поэтому параметру Unique присваиваем значение False .

Подытожим все присвоения значений аргументов:

На следующем шаге мы рассмотрим метод Consolidate .

Источник

Range.AdvancedFilter method (Excel)

Filters or copies data from a list based on a criteria range. If the initial selection is a single cell, that cell’s current region is used.

Syntax

expression.AdvancedFilter (Action, CriteriaRange, CopyToRange, Unique)

expression A variable that represents a Range object.

Parameters

Name Required/Optional Data type Description
Action Required XlFilterAction One of the constants of XlFilterAction specifying whether to make a copy or filter the list in place.
CriteriaRange Optional Variant The criteria range. If this argument is omitted, there are no criteria.
CopyToRange Optional Variant The destination range for the copied rows if Action is xlFilterCopy. Otherwise, this argument is ignored.
Unique Optional Variant True to filter unique records only. False to filter all records that meet the criteria. The default value is False.

Return value

Example

This example filters a database named Database based on a criteria range named Criteria.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Расширенный фильтр VBA

В этом руководстве объясняется, как использовать метод расширенного фильтра в VBA.

Расширенная фильтрация в Excel очень полезна при работе с большими объемами данных, когда вы хотите применить несколько фильтров одновременно. Его также можно использовать для удаления дубликатов из ваших данных. Вы должны быть знакомы с созданием расширенного фильтра в Excel, прежде чем пытаться создать расширенный фильтр из VBA.

Рассмотрим следующий рабочий лист.

Вы можете сразу увидеть, что есть дубликаты, которые вы, возможно, захотите удалить. Тип счета представляет собой смесь сберегательного, срочного и чекового.

Сначала вам нужно настроить раздел критериев для расширенного фильтра. Сделать это можно на отдельном листе.

Для удобства я назвал свою таблицу данных «База данных», а таблицу критериев «Критерии».

Расширенный синтаксис фильтра

Expression.AdvancedFilter Action, CriteriaRange, CopyToRange, Unique

  • В Выражение представляет объект диапазона — и может быть установлен как диапазон (например, Range («A1: A50»)) — или диапазон может быть назначен переменной, и эта переменная может использоваться.
  • В Действие аргумент является обязательным и может иметь значение xlFilterInPlace или xlFilterCopy
  • В Диапазон критериев аргумент — это то, откуда вы получаете критерии для фильтрации (наш лист критериев выше). Это необязательно, поскольку вам не понадобятся критерии, если вы, например, фильтруете уникальные значения.
  • В CopyToRange Аргумент — это то место, куда вы собираетесь поместить результаты фильтра — вы можете фильтровать на месте или вы можете скопировать результат фильтра в альтернативное место. Это также необязательный аргумент.
  • В Уникальный аргумент также является необязательным — Правда фильтровать только уникальные записи, Ложь — фильтровать все записи, соответствующие критериям — если вы его опустите, по умолчанию будет Ложь.

Фильтрация данных на месте

Используя критерии, указанные выше в таблице критериев, мы хотим найти все счета с типами «Сбережения» и «Текущие». Мы фильтруем на месте.

123456789 Sub CreateAdvancedFilter ()Dim rngDatabase как диапазонDim rngCriteria As Range’определить базу данных и диапазоны критериевУстановите rngDatabase = Sheets («База данных»). Диапазон («A1: H50»)Установите rngCriteria = Sheets («Criteria»). Range («A1: H3»)’фильтровать базу данных по критериямrngDatabase.AdvancedFilter xlFilterInPlace, rngCriteriaКонец подписки

Код скроет строки, не соответствующие критериям.

В приведенной выше процедуре VBA мы не включили аргументы CopyToRange или Unique.

Сброс данных

Перед тем, как запустить другой фильтр, мы должны очистить текущий. Это будет работать, только если вы отфильтровали свои данные на месте.

12345 Sub ClearFilter ()При ошибке Возобновить Далее’сбросить фильтр, чтобы показать все данныеActiveSheet.ShowAllDataКонец подписки

Фильтрация уникальных значений

В приведенной ниже процедуре я включил аргумент Unique, но опустил аргумент CopyToRange. Если вы опустите этот аргумент, вы ИЛИ нужно поставить запятую в качестве заполнителя для аргумента

123456789 Sub UniqueValuesFilter1 ()Dim rngDatabase как диапазонDim rngCriteria As Range’определить базу данных и диапазоны критериевУстановите rngDatabase = Sheets («База данных»). Диапазон («A1: H50»)Установите rngCriteria = Sheets («Criteria»). Range («A1: H3»)’фильтруем базу данных по критериямrngDatabase.AdvancedFilter xlFilterInPlace, rngCriteria ,, ИстинаКонец подписки

ИЛИ вам необходимо использовать именованные аргументы, как показано ниже.

123456789 Sub UniqueValuesFilter2 ()Dim rngDatabase как диапазонDim rngCriteria As Range’определить базу данных и диапазоны критериевУстановите rngDatabase = Sheets («База данных»). Диапазон («A1: H50»)Установите rngCriteria = Sheets («Criteria»). Range («A1: H3»)’фильтруем базу данных по критериямrngDatabase.AdvancedFilter Действие: = xlFilterInPlace, CriteriaRange: = rngCriteria, Unique: = TrueКонец подписки

Оба приведенных выше примера кода будут запускать один и тот же фильтр, как показано ниже — данные только с уникальными значениями.

Использование аргумента CopyTo

123456789 Sub CopyToFilter ()Dim rngDatabase как диапазонDim rngCriteria As Range’определить базу данных и диапазоны критериевУстановите rngDatabase = Sheets («База данных»). Диапазон («A1: H50»)Установите rngCriteria = Sheets («Criteria»). Range («A1: H3»)’скопировать отфильтрованные данные в альтернативное местоrngDatabase.AdvancedFilter Action: = xlFilterCopy, CriteriaRange: = rngCriteria, CopyToRange: = Range («N1: U1»), Unique: = TrueКонец подписки

Обратите внимание, что мы могли бы опустить имена аргументов в строке кода расширенного фильтра, но использование именованных аргументов делает код более легким для чтения и понимания.

Эта строка ниже идентична строке в процедуре, показанной выше.

1 rngDatabase.AdvancedFilter xlFilterCopy, rngCriteria, Range («N1: U1»), True

После запуска кода исходные данные по-прежнему отображаются с отфильтрованными данными, отображаемыми в месте назначения, указанном в процедуре.

Удаление дубликатов из данных

Мы можем удалить дубликаты из данных, опустив аргумент Criteria и скопировав данные в новое место.

Источник

Метод Range.AdvancedFilter (Excel)

Фильтрует или копирует данные из списка на основе диапазона условий. Если начальным выделением является одна ячейка, используется текущая область этой ячейки.

Синтаксис

expression. AdvancedFilter (Action, CriteriaRange, CopyToRange, Unique)

выражение: переменная, представляющая объект Range.

Параметры

Имя Обязательный или необязательный Тип данных Описание
Действие Обязательный XlFilterAction Одна из констант XlFilterAction , указывающая, следует ли копировать или фильтровать список на месте.
CriteriaRange Необязательный Variant Диапазон условий. Если этот аргумент опущен, критерии отсутствуют.
CopyToRange Необязательный Variant Диапазон назначения для скопированных строк, если action имеет значение xlFilterCopy. В противном случае этот аргумент игнорируется.
Уникальный Необязательный Variant Значение true для фильтрации только уникальных записей. Значение false для фильтрации всех записей, соответствующих условиям. Значение по умолчанию — False.

Возвращаемое значение

Пример

В этом примере база данных с именем Database фильтруется по диапазону условий с именем Criteria.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Range.AdvancedFilter method (Excel)

vbaxl10.chm144078

vbaxl10.chm144078

excel

Excel.Range.AdvancedFilter

fe1a19fc-ab0f-6149-25d9-6102d5789757

05/10/2019

medium

Range.AdvancedFilter method (Excel)

Filters or copies data from a list based on a criteria range. If the initial selection is a single cell, that cell’s current region is used.

Syntax

expression.AdvancedFilter (Action, CriteriaRange, CopyToRange, Unique)

expression A variable that represents a Range object.

Parameters

Name Required/Optional Data type Description
Action Required XlFilterAction One of the constants of XlFilterAction specifying whether to make a copy or filter the list in place.
CriteriaRange Optional Variant The criteria range. If this argument is omitted, there are no criteria.
CopyToRange Optional Variant The destination range for the copied rows if Action is xlFilterCopy. Otherwise, this argument is ignored.
Unique Optional Variant True to filter unique records only. False to filter all records that meet the criteria. The default value is False.

Return value

Variant

Example

This example filters a database named Database based on a criteria range named Criteria.

Range("Database").AdvancedFilter _ 
 Action:=xlFilterInPlace, _ 
 CriteriaRange:=Range("Criteria")

[!includeSupport and feedback]

What is VBA?

VBA is a programming language that can automate tasks within Excel using macros. You can calculate, move and manipulate data using this language. This is particularly useful for repetitive tasks that don’t have a single formula fix.

If you’re looking for more background, check out this video on the differences between macros and VBA.

If you already have some experience creating macros, this article will show you how to take your skills to the next level with the Excel VBA advanced filter.

Step up your Excel game

Download our print-ready shortcut cheatsheet for Excel.

What is advanced filtering?

VBA advanced filtering is used for more complex filtering needs that the AutoFilter in Excel cannot complete.

You can filter out unique items, extract specific words or dates and even copy them to another document or sheet. In this article, we will be using VBA to control advanced filtering – but first, we need to show you how to build and setup your document so it is ready for VBA advanced filtering. 

How to set up advanced filtering

Here are the steps for setting up the data ready for advanced filtering. I will be using a blue table for the Data Range, and green for the Criteria Range, as shown in the screenshots below.

Database

  • Set up a table or arrangement of data with header names
  • Each header needs a unique name otherwise it will cause issues when filtering
  • The rows below the headers should contain the data you wish to filter
  • No blank rows can be in the data set (apart from the last row at the bottom)

Criteria Range

The criteria range are the rules that will be applied to the data when using the VBA Advanced Filter. You can set one or multiple criteria.

  • This can be set up as a range of cells or as a table 
  • To set up a table, simply select the range of cells including the headers and click Insert → Table 
  • You can rename your table by clicking anywhere on the new table and editing the text where it says ‘Table1’
  • Note: The headers need to match the headers from the database exactly     
  • You don’t need to have every header – just the ones you want to filter by

  • You can use operators within the cell such as:

    • < Less than
    • > Greater than
    • >= Greater than or equal to
    • <= Less than or equal to
    • <> Not equal to

For example, <1000 in the cell would return items that are less than 1000

Extract Range

This tool allows you to set an area of data to copy or move. This is particularly useful if, for example, you want to export out a list of contacts or locations. To set this up:

  • The same rule applies here as the criteria range; the headers need to be exactly the same
  • Note: The headers don’t need to be in the same order and you don’t have to filter all of the columns – just the ones you want to see. For example, if you wanted just a list of names then you would have only the ‘Name’ column on your chosen extract sheet.

Apply the advanced filter

This is to set the area you want to copy the filtered items to.

  • Select any cell in the database
  • On the Excel Ribbon Data tab, click advanced filtering

  • You can choose to filter in place or to another location, depending on how you want to extract the data
  • Set the criteria range
  • Note: When copying to another location Excel will clear any data already stored in your extract location when the filter is applied
  • Click OK

Filtering unique items

There is an option when filtering to only return unique items. This will return only 1 record that meets each of the criteria you have set. To do this:

  • Simply tick the unique box when filtering

Setting up VBA

Advanced filtering is all well and good, but we have to click ‘advanced filter’ every time we want to filter the list down. This is fine, but it’s not why you came to this article!

First, we need to access the Visual Basic screen in Excel – by default, this is turned off. To turn it on go to:

  •  File → Options → Ribbon Settings and turn on the Developer tab
  • This should turn on an extra tab in Excel so you can create, record and modify VBA code using Macros.
  • There are a few kinds of Macros – we will cover:
    • Macros that run by clicking on a button
    • Macros that run when a cell or range is modified

Button VBA macro

To create a button that triggers a VBA macro we need to create a ‘Module’ within VBA. To do this:

  • Navigate to the Developer tab and click on ‘Visual Basic’
  • Right-click on ‘Excel Objects Folder’ and click ‘Create New Module’:

Once you’ve created the new module we can start writing a Macro:

  • We always start with Sub NameOfTheSubroutine () and end with End Sub
  • We would write our code in-between those lines. For example:
Sub Advanced Filtering ()
End Sub

Here is the start of our VBA code that would go in between the lines above:

  • The «Database» would be replaced with the range area of our data
  • The «Criteria» would be replaced by our Criteria range
Range("Database").AdvancedFilter _ 
Action:=xlFilterInPlace, _ 
CriteriaRange:=Range("Criteria")

VBA Code so far:

Sub Advanced_Filtering() 

Range("C6:F23").AdvancedFilter _ 
Action:=xlFilterInPlace, _ 
CriteriaRange:=Range("C2:F3") 

End Sub

We now need to add a button:

  • Insert → Shape → Pick a Shape and draw it onto the sheet. In this case, we’ll use a rectangle.

  • Assign the Macro you have just created by right-clicking on the shape → Assign Macro. Test it by typing in the criteria range and click the button you’ve just added

Automatic VBA macro

We’ve just created a button to trigger our macro, but that’s an extra step – we want the list to just filter when we enter something into those cells. To do this we can use Worksheet_Change to trigger the Macro we have just created to run when we update the criteria changes.

  • Right-click on the sheet and click ‘View Code’ – if this doesn’t work you can access via Visual Basic view on the Developer tab. Then double-click on the sheet with your criteria range on it (In this example it’s sheet 1).

Another way to trigger a VBA Macro is to get Excel to automatically trigger whenever a sheet is updated — In other words when you add, update or change a cell.

This is great, but we don’t want Excel to trigger the code when any cell is updated — We only want to trigger the Macro when a specific range is updated.

  • The code below will first check to see if the cells updated are C3 to F3 (our criteria range) and if it’s not it will kill the subroutine (Then Exit Sub).
  • If it is within those cells, it triggers our first Macro to run
  • This is useful and important as will only allow the code to run when we edit those cells
  • If we didn’t have the ‘If Intersect’, it would run every time any cell is changed
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("C3:F3")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub 
Call Advanced_Filtering 

End Sub

VBA copy to a new location

To alter the VBA to copy to a new location we simply need to change 2 parts of the code:

  • We need to change Action:=xlFilterInPlace to Action:=xlFilterCopy
  • And add CopyToRange:=Sheets(«SHEET NAME»).Range(«RANGE») to the end
  • Here’s what the final code should look like. This will filter the data from Sheet 1 into Sheet 1 in the range A1:D1:
Sub Advanced_Filtering() 

CriteriaLastRow = 4 'Last Row you have in the Criteria range 

For i = 3 To CriteriaLastRow 'Loops through until the last Row 
  RowsCount = Application.WorksheetFunction.CountA(Range("C" & i & ":F" & i)) 
  If RowsCount = 0 Then CriteriaRowsSet = i - 1 Else CriteriaRowsSet = CriteriaLastRow 'Checks to see if any row returns 0 and sets it to the row above's number 
Next i 

Range("C6:F23").AdvancedFilter _ 
Action:=xlFilterInPlace, _ 
CriteriaRange:=Range("C2:F" & CriteriaRowsSet), _ CopyToRange:=Sheets("Sheet2").Range("A1:D1") 

End Sub

What we have gone through so far just covers the basics of filtering, but there is much more filtering is capable of. Let’s take a look at VBA advanced filtering with multiple criteria and wildcards.

Advanced filtering with multiple criteria

Currently, the criteria range can only handle AND statements – meaning it would need to meet all of the criteria to display after filtering. If I wanted to do an OR statement (i.e. I want to show results that are either Wang OR John) then I would need to expand my criteria table:

  • First I would expand my row at the bottom to allow for more statements
  • Expand both Macros to allow for the extra row
  • Note: Make sure when moving or adding new rows that the Macros are still looking at the correct range. Macros are not like formulas that automatically change when you add new rows
  • If you do need to add/remove cells then you would need to go back into the VBA code and extend or shorten the range of cells within the code.

If we wanted to remove a column, for example, we would change this code:

Range("C6:F23").AdvancedFilter _ 
Action:=xlFilterInPlace, _ 
CriteriaRange:=Range("C2:F" & CriteriaRowsSet), _ 
CopyToRange:=Sheets("Sheet2").Range("A1:D1")

To this code:

Range("C6:E23").AdvancedFilter _ 
Action:=xlFilterInPlace, _ 
CriteriaRange:=Range("C2:E" & CriteriaRowsSet), _ 
CopyToRange:=Sheets("Sheet2").Range("A1:D1")

Notice I changed both the Filter area and the range Criteria. This is showing me records that are for Wang AND 2/2/2018 OR John:

Note: This will not work unless something is contained within both rows or all of the rows if you have more. So we will need to add some code to find which is the bottom row:

  • The code below starts off and sets the last row to 4 (meaning the last row number for your criteria)
  • It then loops through and checks each row from 3 to your last row and counts how many items are in there
  • If it gets right to the bottom and nothing is 0 it sets the criteria range to your full criteria data
  • If it returns a 0 on any line it sets the range to the row above it
Sub Advanced_Filtering()

CriteriaLastRow = 4 'Last Row you have in the Criteria range 

For i = 3 To CriteriaLastRow 'Loops through until the last Row 
  RowsCount = Application.WorksheetFunction.CountA(Range("C" & i & ":F" & i))
  If RowsCount = 0 Then CriteriaRowsSet = i - 1 Else CriteriaRowsSet = CriteriaLastRow 'Checks to see if any row returns 0 and sets it to the row above's number. 
Next i

  Range("C6:F23").AdvancedFilter _
  Action:=xlFilterInPlace, _
  CriteriaRange:=Range("C2:F" & CriteriaRowsSet)

End Sub

Advanced filtering with wildcards

Wildcard filtering is where we use a special character to replace a letter to give us similar results.

To use a Wildcard we wouldn’t need to amend any data or VBA code. We would use a symbol within the search criteria.

  • The asterisk (*) wildcard character represents any number of characters in that position, including zero characters.
  • The question mark (?) wildcard character represents one character in that position.

For example, *ang would return anything that ended with the letters ang:

In summary

So, what have we learned?

  • That almost any task/function in Excel can be automated using VBA
  • How to filter down data more precisely and accurately using VBA
    • How to filter down by wildcards
    • How to move our filtered data to another location
    • How to filter using multiple criteria
  • The basics of being able to loop through data and perform a function on each line. This is not just limited to advanced filtering as it can be used with other Excel functions
  • The different triggers for VBA in Excel:
    • Button – A Macro will run on a click of a button
    • Call – A Macro will be ‘called’ (triggered) from another Macro
    • Change – A Macro will run when a sheet is updated

This tutorial only covers a small portion of the capability VBA and Macros have in Excel. If you’d like to learn more about creating powerful macros to automate your tasks, check out our Macros and VBA course.

Now that you’ve got filtering down pat, why don’t you try creating your own user defined functions? Learn from the pros with our step-by-step guide on how to build Excel UDFs.

Ready to become a certified Excel ninja?

Take GoSkills’ Macros & VBA course today!

Start free trial

Метод AdvancedFilter

Перейдем теперь к рассмотрению более полезного для программистов и в любом случае более универсального метода фильтрации записей — AdvancedFilter. Вот его синтаксис:

Function AdvancedFilter(Action As XlFilterAction, [CriteriaRange], [CopyToRange], [Unique])

Это метод вызывается объектами Range и возвращает объект Range, задающий список. Параметры метода имеют следующий смысл:

  • Action — может принимать одно из двух значений: xlFilterInPlace, xlFilterCopy.; первое из них указывает, что список фильтруется на месте, второе — задает возможность копирования результатов на новое место. О недостатках фильтрации на месте я уже говорил, поэтому при программировании целесообразно копировать значения, — это облегчает доступ к выбранным записям.
  • CriteriaRange — задает область, в которой можно записать логическую формулу, задающую условие выбора записей. Заметьте, что здесь формула позволяет задать условия, одновременно налагаемые на все поля записи. О том, что собой представляет область критериев и как строится формула, задающая условие, я скажу чуть ниже.
  • CopyToRange — задает область копирования результатов фильтрации.
  • Unique — булев параметр, значение True которого позволяет отобрать только один экземпляр записи в случае, когда она многократно встречается в списке. Если параметр имеет значение False, то выдаются все имеющиеся экземпляры записи.

Чтобы понять, как работает метод, нужно четко представлять, что собой представляет область критериев и как в ней формируется условие выбора. Этим мы сейчас и займемся. Для создания области критериев нужно выбрать любую свободную область листа и задать в ней имена полей. Заметьте, в этой области имя одного и того же поля может появиться дважды. На следующем шаге следует задать логическую формулу, накладывающую ограничения на поля выбираемых записей. Для тех, кто знаком с логикой, скажем, что эта формула записана в дизъюнктивной нормальной форме и представляет собой дизъюнкцию конъюнктов. Каждый конъюнкт записывается в отдельной строке под именами полей. Все члены в одной строке соединены знаком конъюнкции » And «, а отдельные строки — знаком дизъюнкции » Or «. Теперь попробуем сказать то же самое, но проще. Условия выбора можно задавать в нескольких строчках. Если есть две строки и условие в первой из них обозначить через F1, а во второй — F2
, то общее условие будет иметь вид F1 Or F2. Сами условия F1 и F2 могут быть достаточно сложными. Они объединяют знаком » And » элементарные условия, накладываемые на каждое поле в отдельности. Элементарные условия — это известные нам по методу AutoFilter отношения » >, <, = и т. д.». Поэтому в области критериев имена полей могут встречаться дважды, чтобы была возможность задать условие вида » (Поле1 > 10) And (Поле1<= 20) «.

Из сказанного следует, что расширенный фильтр позволяет формировать сложные условия отбора записей из списков. При этом я рассказал еще не обо всех его возможностях. Так, для текстовых полей можно задать образец, которому соответствуют множество записей. При этом действуют обычные в таких случаях правила:

  • Если в образце используется символ » ?», то в записи ему соответствует любой символ; образцу » к?т » соответствуют, например, записи с полями » кит » и » кот «.
  • Если в образце используется символ » * «, то в записи ему соответствует любая последовательность символов. Так, образцу » *он » соответствуют записи » он «, » кон » и » Наполеон «.
  • Чтобы символы «?» и » * » могли использоваться как обычные, им должен предшествовать символ тильда » ~ «; образцу » Кто~?» соответствует строка » Кто?».
  • Любому образцу соответствуют все строки, чьим префиксом он является. Так, образцу «Петр» соответствуют строки: Петр, Петрушка, Петрович. Чтобы задать точное соответствие, условие сравнения нужно ввести в виде: =»=Петр».

Внимательно взгляните на рисунок, где показан слегка видоизмененный список из предыдущего примера. Здесь же показаны две области, отведенные под критерии, и результаты двух запросов, реализуемых двумя вызовами метода AdvancedFilter:

Приведем теперь процедуру, дважды вызывающую расширенный фильтр с различными областями критериев:

Sub РасширенныйВыбор()
	'Сложное условие фильтрации.
	Range("МойСписок").AdvancedFilter Action:=xlFilterCopy, _
		CriteriaRange:=Range("F7:K14"), _
		CopyToRange:=Range("A13:D13"), Unique:=True
	'Здесь условие проще.
	Range("МойСписок").AdvancedFilter Action:=xlFilterCopy, _
		CriteriaRange:=Range("F16:G21"), _
		CopyToRange:=Range("I16:L16"), Unique:=False
End Sub

Первый вызов метода AdvancedFilter стоит обсудить подробнее. Метод вызывается объектом Range, задающим список. Как мы говорили ранее, список целесообразно именовать. В нашем примере его имя — «МойСписок». Результаты фильтрации копируются в область, заданную параметром CopyToRange. Размер этой области заранее не известен, но знать его и не нужно — достаточно указать диапазон для записи заголовков полей. Под строкой заголовков будут располагаться записи, выбранные при фильтрации. А вот область, отведенную для критериев, следует указать точно. При этом не следует ее именовать, как рекомендовано в документации. Во всяком случае, этого не стоит делать, если предполагается несколько различных запросов или они будут модифицироваться.

Что же записано в области «F7:K14», задающей условие выборки? В строке заголовков — имена полей, причем имена второго и третьего полей повторены дважды. Хотя исходный список содержит 4 поля, область критериев имеет 6 столбцов. Ниже строки заголовков расположены 7 строк, каждая из которых задает некоторое условие выбора записей. Выпишем явно условие, которое задают строки этой области. Вы можете проверить запись формулы, глядя на предыдущий рисунок. Конечно, для меня на самом деле исходной являлась эта формула, в соответствии с ней заполнялись ячейки в области критериев. Вот эта довольно сложная формула:

( (Поле3 >=5) And (Поле3 < 7) And (Поле4 = "low") ) OR
( (Поле1 = "Мария") And (Поле4 = "high") ) OR
(Поле2 = 37) OR
( (Поле2 > 20) And (Поле3 < 20) And (Поле3 > 15) And (Поле4 ="middle") ) OR
( (Поле1 = "Анна") And (Поле4 = "high") ) OR
( (Поле1 = "Петр") And (Поле4 = "low") ) OR
( (Поле1 = "Алиса") And (Поле2 = 24) And (Поле4 = "low") )

Формула состоит из 7 дизъюнктов, каждый из них независимо добавляет новые записи в результирующую выборку. Рассмотрим их:

  • первый — выделяет из списка две одинаковые записи со значением Anna в первом поле. Однако, поскольку параметр Unique имеет значение True, выбираться будет только одна уникальная запись.
  • второй дизъюнкт выделяет из списка запись с именем Мария, имеющей в 4-м поле значение high ;
  • третий — самый простой: он должен выделить записи, имеющие в поле 2 значение 37 ; такая запись есть в списке, это запись с именем Петр (high) ;
  • четвертый дизъюнкт правильно выделяет запись со значением middle -это запись с именем Петр (middle) ;
  • пятый — выделяет запись с именем Анна (high) ;
  • шестой дизъюнкт выделяет две записи с именами Петр (low) и Петрович (low) ;
  • седьмой — выделяет еще одну запись.

В результате этого сложного запроса из списка выделяется 8 записей из 9. По сути, выбраны все записи без дублирования. Следующий запрос мы не будем рассматривать подробно. Заметьте лишь, что в запросе изменено значение параметра Unique, и потому оба экземпляра продублированной записи появятся в результирующей выборке.

Изменение данных в списке

Расширенный фильтр позволяет выделить из списка записи, удовлетворяющие некоторому критерию. Дальше с этими записями можно работать, используя обычные методы работы с Range -объектами. Но как быть, если необходимо провести корректировку выделенных записей. Понятно, что эту корректировку чаще всего нужно делать непосредственно в базе данных, т. е. в исходном списке. Но у нас нет информации о том, какой порядковый номер в списке имеет первая выделенная запись. Как всегда, в таких ситуациях нечего надеяться на систему и следует самому позаботиться о себе. Включайте в каждый список первым полем порядковый номер записи (во многих таблицах обычная практика, когда первым идет счетчик). Тогда в каждой выделенной записи есть поле, задающее ее порядковый номер, а этого достаточно, чтобы добраться до записи в списке и изменить ее нужным образом. В заключение заметим, что если стандартных методов сортировки и фильтрации данных списков не хватает, то на VBA можно написать обработку любого сколь угодно сложного запроса. В последующих главах будут продемонстрированы способы работы с офисными документами, значительное внимание при этом будет уделено различным запросам на выбор данных, вопросам динамического пополнения базы данных в процессе появления новых документов, также как и использованию информации, хранящейся в базе данных для создания документов.

Понравилась статья? Поделить с друзьями:
  • Advanced word list english
  • Against the rules word
  • Advanced word for visit
  • Against the law in one word
  • Against all odds one word