Excel VBA Сохранение настроек автофильтра с датами

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

Dim FilterArray()
With FrontPage.AutoFilter.Filters
    ReDim FilterArray(1 To .Count, 1 To 3)
    For f = 1 To .Count
        With .Item(f)
            If .On Then
                FilterArray(f, 1) = .Criteria1
                If .Operator Then
                    FilterArray(f, 2) = .Operator
                    If .Operator = xlAnd Or .Operator = xlOr Then
                        FilterArray(f, 3) = .Criteria2
                    End If
                End If
            End If
        End With
    Next f
End With

Это отлично работает во всех ситуациях, с которыми я сталкивался, за исключением полей даты. В случае полей даты Criteria1 и Criteria2 вызывают ошибки (ошибка, определяемая приложением или объектом), а Operator возвращает значение 7. Это произошло в Excel 2007 и все еще происходит в Excel 2013.

Я предполагаю, что причина, по которой это не работает, связана с вложенным способом, которым автофильтры обрабатывают поля даты, но есть ли способ заставить это работать с датами? Я видел и другие проблемы, связанные с применением фильтров к датам, но, конечно же, их хранение должно быть проще?

И второстепенный вопрос - что означает значение 7 для Оператора? Я могу найти только перевод значений 0-2.


person BBaxter    schedule 02.12.2013    source источник
comment
Какую версию Excel вы используете?   -  person Sam    schedule 02.12.2013
comment
Я нахожусь в 2013 году, но у меня была такая же проблема с 2007 годом.   -  person BBaxter    schedule 02.12.2013


Ответы (3)


Я выяснил, чтобы включить фильтр Date in Array.

Параметр ниже должен быть отключен (по умолчанию включен)

ActiveWindow.AutoFilterDateGrouping = False
person Eric K.    schedule 01.12.2015

Я изменил ваш код, и теперь он хорошо работает с датами в моем Excel 2013:

' .Criteria1/2 are read as strings with local decimal separator
' but for re-setting Criteria1/2 should be in American format ...
' so replace local decimal separator by dot - this seems to apply also for dates, 
' because dates are also transformed internally to decimal numbers
FilterArray(f, 1) = Replace(.Criteria1, Application.International(xlDecimalSeparator), ".")

(аналогично .Criteria2)

Что касается вашего второстепенного вопроса: см. Пример кода в этом сообщении: Как в Excel VBA сохранить / восстановить пользовательский фильтр?

person user3746782    schedule 17.06.2014

Обратите внимание: приведенное ниже решение применимо к Excel 2010, я не могу найти информацию в Excel 2013, но, возможно, существует та же проблема.
Если вы записываете макрос во время работы с автоматическим фильтром даты, вы заметите, что значения хранятся в параметре Criteria2, а Criteria1 не используется:

Range.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(2, "8/10/2015", 2, "8/20/2015")

Попытка получить доступ к параметру Criteria2 из VBA вызывает «ошибку, определяемую приложением или объектом».
На момент написания этого ответа единственный известный мне способ сохранить эту информацию автофильтрации - это прочитать данные XML внутри xlsx файл. Рабочий код здесь:
Получить автофильтр даты в Excel VBA

person rayzinnz    schedule 18.08.2015