Автофильтр - очень удобный инструмент 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
При этом формат фильтруемых ячеек у вас может оставаться датой.