Цикл массива критериев автофильтра Excel

Мне нужно отфильтровать столбец по датам. Я определяю количество необходимых дат, а затем применяю фильтр. Первоначально я полагал, что было только 2 случая, со вторника по пятницу, когда вы используете предыдущую дату. И понедельник там, где нужны пятница, суббота и воскресенье.

Потом я понял, что может быть праздник в пятницу или понедельник, и для этого потребуется больше дат... и может быть праздник в середине недели, например, День Благодарения. Затем я придумал это, чтобы охватить 4 наиболее распространенных возможности:

  dPosting = dLast + 1 'dLast is the last Date used in the filter
  Select Case Date - dLast
    Case 2: 'Regular T - F (1 day)
      shFF.Range("A1", shFF.Cells(lMax, lCol)).AutoFilter Field:=cFind.Column, Operator:=xlFilterValues, Criteria1:=Array(2, dPosting)
    Case 3: 'Midweek Holiday (2 days)
      shFF.Range("A1", shFF.Cells(lMax, lCol)).AutoFilter Field:=cFind.Column, Operator:=xlFilterValues, Criteria1:=Array(2, dPosting, 2, dPosting + 1)
    Case 4: 'Regular Monday (3 days)
      shFF.Range("A1", shFF.Cells(lMax, lCol)).AutoFilter Field:=cFind.Column, Operator:=xlFilterValues, Criteria1:=Array(2, dPosting, 2, dPosting + 1, 2, dPosting + 2)
    Case 5: 'After F or M Holiday (4 days)
      shFF.Range("A1", shFF.Cells(lMax, lCol)).AutoFilter Field:=cFind.Column, Operator:=xlFilterValues, Criteria1:=Array(2, dPosting, 2, dPosting + 1, 2, dPosting + 2, 2, dPosting + 3)
    Case Else: 'Other
      MsgBox "Too many days since last run.  Please contact me", vbCritical, "Out of Scope"
  End Select

Затем я подумал, что, если человек, который занимается этим, уедет на неделю в отпуск... и добавил Case Else.

Теперь я думаю, что самым простым и чистым способом будет просто определить количество необходимых дат от последней даты, которая была запущена dLast и сейчас. Поместите это в массив и используйте его как критерии... но я не могу понять синтаксис.

Проверил это, но все еще не могу заставить его работать:

Это мой тестовый код для игры с синтаксисом и таблицей данных:

Sub Test()
Dim i As Integer
Dim d As Date
Dim sArr(0 To 2) As String

  d = #4/25/2016#
  For i = 0 To 2
    sArr(i) = "2, """ & d + i & """"
  Next i
  ActiveSheet.Range("$A$1:$R$16643").AutoFilter Field:=17, Operator:=xlFilterValues, Criteria1:=sArr

End Sub

Макрорекордер выдает это для использования 3 дат:

    ActiveSheet.Range("$A$1:$R$16643").AutoFilter Field:=17, Operator:=xlFilterValues, _
Criteria2:=Array(2, "4/25/2016", 2, "4/26/2016", 2, "4/27/2016")

Что мне не хватает??


person Rdster    schedule 05.05.2016    source источник
comment
У вас могут быть праздничные дни на листе, а затем сделать что-то вроде dim r as range: установить r = find (дата, праздничные дни): если r ничего не значит, то не праздничные дни через ваши даты или использовать application.countif ( public hols, date) Вы также можете попробовать отловить ошибку, добавляя каждый фильтр по очереди, поэтому, если 01/01/16 не находится в фильтре, он выдаст ошибку, а затем перейдите к следующему.   -  person Nathan_Sav    schedule 05.05.2016
comment
Я думал об этом, но это для пользователя, которому затем, возможно, придется обновить этот список праздников ... и это будет кошмар. Кроме того, они по-прежнему хотят иметь возможность проверять эти даты независимо от статуса праздника.   -  person Rdster    schedule 05.05.2016


Ответы (1)


Не могли бы вы использовать что-то вроде этого и вычислить даты, dt1 и dt2, используя Date - dLast вместо выбора, и попробовать

.AutoFilter Field:=2, Criteria1:= ">=" & dt1, Operator:=xlAnd, Criteria2:="<=" & dt2
person Nathan_Sav    schedule 05.05.2016
comment
Это сработало для меня. Мне это нравится, потому что я также могу избавиться от массива. Дни будут идти подряд, так что это должно работать нормально. Спасибо. - person Rdster; 05.05.2016