2016-05-05 13 views
2

Ich muss eine Spalte nach Daten filtern. Ich bestimme die Anzahl der benötigten Daten und wende dann den Filter an. Ursprünglich dachte ich, es gäbe nur 2 Fälle, Dienstag bis Freitag, wo du das vorherige Datum benutzt. Und Montag, wo Freitag, Samstag und Sonntag benötigt werden.Excel Autofilter Kriterien Array Schleife

Dann erkannte ich, dass es am Freitag oder Montag einen Urlaub geben könnte, und es würde mehr Daten erfordern ... und es könnte einen Wochenmitte-Feiertag geben, wie Thanksgiving. Ich kam dann mit diesem bis zu den vier häufigsten Möglichkeiten abdecken:

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 

Dann dachte ich, was ist, wenn die Person, die diese läuft für den Urlaub für eine Woche ist aus ... und warf in der Case Else.

Jetzt denke ich, dass der einfachste und sauberste Weg sein wird, einfach die Anzahl der Daten zu bestimmen, die vom letzten Datum, das dLast und jetzt ausgeführt wurde, benötigt werden. Setze das in ein Array und verwende das als Kriterium ... aber ich kann die Syntax nicht herausfinden.

Auf diese, aber noch kann es aber nicht funktioniert:

Dies ist mein Testcode mit der Syntax und Daten zu spielen blatt:

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 

Der Makro-Recorder spuckt die 3 Tage, für die Verwendung von aus:

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") 

Was bin ich ??

+0

Sie könnten die öffentlichen Feiertage in dem Blatt, dann Machen Sie etwas wie dim r als Bereich: set r = find (Datum, Feiertage): wenn r nichts ist, dann keine Bankfeiertage durch Ihre Daten, oder verwenden Sie application.countif (öffentliche hols, date) Sie könnten auch versuchen, den Fehler abzufangen Hinzufügen jedes Filters der Reihe nach, wenn also 01/01/16 nicht im Filter ist, wird es einen Fehler geben, dann gehe zum nächsten weiter. –

+0

Ich habe darüber nachgedacht, aber das ist für einen Benutzer, der dann diese Feiertagsliste möglicherweise aktualisieren müsste ... und das wäre ein Albtraum. Außerdem möchten sie diese Daten unabhängig vom Urlaubsstatus überprüfen können. – Rdster

Antwort

1

Könnten Sie so etwas wie diese, und berechnen Sie die Termine, DT1 und DT2, Datum mit - DLast anstelle der wählt, und versuchen

.AutoFilter Field:=2, Criteria1:= ">=" & dt1, Operator:=xlAnd, Criteria2:="<=" & dt2 
+0

Das hat bei mir funktioniert. Ich mag das, weil ich das Array auch loswerden kann. Die Tage werden aufeinanderfolgend sein, also sollte das gut funktionieren. Vielen Dank. – Rdster

Verwandte Themen