Познавательное

Отбор пустого множества записей

  

Условие расширенного фильтра может быть задано таким образом, что в результате применения последнего будет отобрано пустое множество записей.
Чтобы определить данную ситуацию при фильтрации "на месте", следует проверить, возвращает ли метод SpecialCells ошибку времени выполнения 1004
(не найдено ни одной ячейки, удовлетворяющей заданным условиям). Для этого воспользуемся универсальной ловушкой ошибок, как показано ниже. (Более подробно обработка ошибок рассматривается в главе 23, "Обработка ошибок".)

On Error GoTo NoRecs
For Each cell In Range(" A2:A" & FinalRow).SpecialCells( _
xlCellTypeVisible)
Ctr = Ctr + 1
Next cell
On Error GoTo 0
MsgBox Ctr & " строк удовлетворяют заданному критерию"
Range ("Al11) .Select
Exit Sub
NoRecs:
MsgBox "Нет строк,  удовлетворяющих заданному критерию"

Чтобы подобная ловушка сработала, следует исключить строку заголовка из диапазона ячеек, передаваемого методу SpecialCells. В противном случае метод SpecialCells не сгенерирует ошибку 1004, поскольку строка заголовка остается видимой и после применения расширенного фильтра.

Отображение записей, скрытых в результате фильтрации "на месте"
Чтобы отобразить все строки исходного диапазона, скрытые в результате применения расширенного фильтра "на месте", воспользуйтесь методом
ShowAllData, как показано ниже:
ActiveSheet.ShowAllData


Отбор только уникальных записей при фильтрации "на месте"
В результате отбора только уникальных записей при фильтрации "на месте" расширенный фильтр скроет строки, в которых одинаковыми являются значения всех столбцов исходного диапазона. Другими словами, фильтрация "на месте" не позволяет отобрать строки с уникальной комбинацией только некоторого подмножества столбцов исходного диапазона, например, столбца с названием фирмы-заказчика и столбца с наименованием товара.

Использование расширенного фильтра для копирования всех записей, удовлетворяющих заданному условию
Ранее в этой главе рассматривался отбор уникальных значений из исходного диапазона данных и их копирование в другую область рабочего листа. В частности, составлялись списки заказчиков, регионов и товаров, которые затем использовались при заполнении соответствующих списков на форме. Тем не менее, в повседневной жизни расширенный фильтр обычно используется для отбора всех записей, удовлетворяющих определенному условию. Например, при генерации отчета о сделках фильтр возвращает все записи, соответствующие выбранным пользователем заказчикам. Чтобы отобрать все записи, удовлетворяющие заданному критерию, сбросьте флажок Только уникальные записи (Unique records only) в диалоговом окне Расширенный фильтр (Advanced Filter) (если расширенный фильтр создается с помощью пользовательского интерфейса Excel) или установите значение параметра Unique метода AdvancedFilter равным False (если расширенный фильтр создается с помощью VBA). Если требуется отобрать только подмножество столбцов исходного диапазона данных, скопируйте их заголовки в первую строку области вставки результата фильтрации, при необходимости изменив порядок их следования.
В следующих разделах рассматриваются различные примеры использования расширенного фильтра.

Копирование всех столбцов исходного диапазона данных
Чтобы скопировать все столбцы строк, удовлетворяющих заданному условию, укажите в качестве области вставки результата пустую ячейку.
Sub AllColumnsOneCustomer()
Dim IRange As Range
Dim ORange As Range
Dim CRange As Range
'  Определение размера исходного диапазона данных.
FinalRow = Cells(65536/   1).End(xlUp).Row
NextCol = Cells(l,  255).End(xlToLeft).Column + 2
'  Определение столбца,  по которому будет проводиться фильтрация.
Cells(1,  NextCol).Value = Range("Dl").Value
'  В действительности,   значение CDE INC. должно
'  вводиться посредством пользовательской формы.
Cells(2,  NextCol).Value = "CDE INC."
Set CRange = Cellsd, NextCol). Resize {2 , 1)
' Определение целевого диапазона данных  {пустая ячейка).
Set ORange = Cellsd, NextCol + 2)
'  Определение исходного диапазона данных.
Set IRange = Range("Al").Resize(FinalRow, NextCol - 2)
'  Применение расширенного фильтра для отбора строк,
'  удовлетворяющих заданному условию.
IRange.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=CRange,  CopyToRange:=ORange
Range{"LI").Select
End Sub

Результат выполнения приведенного выше макроса показан на рис. 11.17.
Отбор пустого множества записей

Рис. 11.17. Указав пустую ячейку в качестве области вставки результата применения расширенного фильтра, вы получите все столбцы строк, удовлетворяющих заданному условию
 


Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.