2017-04-25 1 views
0

stoppen Ich bin derzeit ein Problem, wobei ich das Makro von Montag bis Samstag, exklusive Feiertage, da es keine Berichte, die während der PH gesendet werden müssen . Unten ist mein Code:Excel VBA - Wie man Makro von der Arbeit während Feiertags

Sub schedule() 
If Weekday(Date, vbMonday) < 6 Then 
     Application.OnTime TimeValue("11:00:00"), "broadcast" 
     Application.OnTime TimeValue("12:00:00"), "broadcast" 
     Application.OnTime TimeValue("13:00:00"), "broadcast" 
     Application.OnTime TimeValue("14:00:00"), "broadcast" 
     Application.OnTime TimeValue("15:00:00"), "broadcast" 
     Application.OnTime TimeValue("16:00:00"), "broadcast" 
     Application.OnTime TimeValue("17:00:00"), "broadcast" 
     Application.OnTime TimeValue("18:00:00"), "broadcast" 
     Application.OnTime TimeValue("19:00:00"), "broadcast" 
End If 
If Weekday(Date, vbMonday) = 6 Then 
     Application.OnTime TimeValue("20:00:00"), "broadcast" 
End If 

End Sub 

Vielen Dank im Voraus

+0

Was meinen Sie mit "Feiertag"? Nur diejenigen, die nationale Feiertage sind? Diejenigen, die Urlaub in einigen Staaten sind, aber nicht in anderen? Regionale? (d. h. haben Sie irgendwo eine Liste mit Daten, die Sie für "Feiertage" halten? Wenn ja, wo wird diese Liste gespeichert?) – YowE3K

+0

@ YowE3K Wenn ich "Feiertag" meine, meine ich nationale Feiertage. Zum Beispiel "Feiertage" wie Weihnachten, Neujahr usw. Danke – user7377729

+1

Implementieren Sie eine Liste von Daten, die Sie als Feiertag betrachten. Und implementieren Sie als erste Zeilen so etwas wie eine Schleife durch ein Array mit allen Feiertagen und wenn Datum entspricht einem Feiertag "Datum" im Array dann "exit sub" –

Antwort

2

Dim arrHolidays As Variant, iDay As Variant 
arrHolidays = Array(DateSerial(2017, 4, 25), DateSerial(2017, 4, 26)) 'Add all your holidays here 

For Each iDay In arrHolidays 
    If Date = iDay Then Exit Sub 'exit this sub if date is a holiday 
Next 
für/jede Schleife

oder statt der so etwas wie das zu Beginn des Terminplans implementieren können Sie VBA.Filter verwenden (wie @RobinMackenzie wies darauf hin seinen Kommentar).

Dim arrHolidays As Variant, iDay As Variant 
arrHolidays = Array(DateSerial(2017, 4, 25), DateSerial(2017, 4, 26)) 'Add all your holidays here 

If UBound(VBA.Filter(arrHolidays, Date)) >= 0 Then Exit Sub 

Alle Feiertage müssen in der arrHolidays angegeben werden. Wenn Date ein Feiertag ist, wird die Ausführung abgebrochen und Exit Sub.


Um die Urlaubsdaten aus einem Arbeitsblatt „Urlaub“ Spalte A

Verwendung zu laden
arrHolidays = Application.Transpose(Worksheets("Holidays").Range("A:A").Value) 

Anmerkung: Wir müssen hier transponieren aus diesem Bereich ein eindimensionales Array zu erhalten.

+1

Du kannst die Schleife mit 'If UBound (VBA.Filter (arrHolidays, Datum)) <1 Then ...' –

+0

@RobinMackenzie vermeiden Nizza Ich wusste nicht über 'VBA.Filter'. Aber es hat nicht für mich funktioniert; Bist du dir sicher über das '<1'? Laut meinen Tests sollte es 'IfBound (VBA.Filter (arrHolidays, Date))> = 0 Then Exit Sub' sein, weil es' -1' ist, wenn das Datum nicht innerhalb des Arrays liegt und '> = 0' wenn das Datum ist mindestens einmal vorhanden. –

+0

Ja, Sie haben recht - meine Codezeile sagt "no match", aber für Ihre Antwort sollten Sie tun, was Sie gesagt haben, und "> = 0" testen, um "Ja, heute ist ein Feiertag" zu sagen. –