MyTetra Share
Делитесь знаниями!
5. Данные
09.12.2017
17:55
Раздел: VBA - Словарь VBA

Автофильтр - очень удобный инструмент Excel и поэтому использовать его в VBA тоже хотелось бы. Но порой не всё так просто. Здесь я опишу лишь те проблемы, с которыми приходилось бороться лично, но не факт, что это исчерпывающий список.

 

1. То, что в обычно жизни значение ячейки, в VBA может оказаться совсем не значением.

Была задача - подтянуть с помощью ВПР конкретное поле, а потом отфильтровать, оставив только тех, кто нашелся. Т.е. в обычной жизни я ставлю автофильтр "всё, кроме #Н/Д". Записываю рекордером, всё достаточно очевидно:

 

     ActiveSheet.Range("$A$1:$K$4480").AutoFilter Field:=10, Criteria1:="<>#Н/Д"

 

Однако на деле подобная запись оставит все записи. А дело всё в том, что то, что мы видим как "#Н/Д", для VBA совсем не "#Н/Д", а "Error 2024". Подозреваю, что автофильтр на другие подобные "служебные" значения ячеек (например, #ДЕЛ/0) будет иметь те же проблемы.

Выход прост - не создавайте ошибок в ячейках, используйте функции Excel для обработки ошибок (еслиошибка, енд и др). Укажите что-нибудь осмысленно-бессмысленное для вывода в ячейку в случае ошибки (например, 11111 или ёёёёёёё), чтобы вы однозначно могли отличить ошибки от нормальных данных. А затем используйте автофильтр:

     Range("$A$1:$K$4480").AutoFilter Field:=10, Criteria1:="<>11111"

 

2. Вторая проблема, с которой пришлось столкнуться, это фильтр на даты. Макрорекордер подсказывает нам синтаксис:

     Range("$A$1:$J$4480").AutoFilter Field:=3, Criteria1:=">28.08.2014"

 

Но использовать конкретную дату в макросе обычно нет смысла. Обычно мы используем переменную дату - последний год/полугодие/месяц. Поэтому синтаксис должен быть примерно таким:

      Range("$A$1:$J$4480").AutoFilter Field:=3, Criteria1:=">" & dat

 

Переменная же обычно задается от текущей даты (например, dat=Date-30). Однако, если оставить переменную в формате даты, фильтр не сработает. Её нужно сначала перевести в числовой формат. При этом у меня не сработал перевод в целое число, хотя гугл подсказывал мне его. Заработал толкьо с дробным. Итак, итоговый код:

     dat = CDbl(Date) - 180   ' получаем число типа 44000

     Range("$A$1:$J$4480").AutoFilter Field:=3, Criteria1:=">" & dat

 

При этом формат фильтруемых ячеек у вас может оставаться датой.

 
MyTetra Share v.0.52
Яндекс индекс цитирования