2013-12-02 4 views
0

У меня есть часть макроса, в котором хранятся параметры автофильтра перед очисткой фильтра, поэтому они могут повторно их использовать позже. Код выглядит следующим образом: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 вызывают ошибки (определенная пользователем или объектная ошибка), в то время как оператор возвращает значение 7. Это произошло в Excel 2007 и все еще происходит в Excel 2013.

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

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

+2

'xlFilterValues ​​= 7' –

+0

Какая версия Excel вы используете? – Sam

+0

Я нахожусь в 2013 году, но имел такую ​​же проблему с 2007 годом – BBaxter

ответ

0

Я изменен код и он работает теперь хорошо и с датами в моем 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)

Что касается вашего вопроса вторичного: смотри пример кода в этом Должность: In Excel VBA, how do I save/restore a user-defined filter?

0

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

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

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

0

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

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

ActiveWindow.AutoFilterDateGrouping = False 
Смежные вопросы