2017-04-25 64 views
0

我目前正面臨一個問題,我需要宏從星期一到星期六運行,不包括公共假期,因爲在PH期間沒有報告要發出。下面是我的代碼:Excel VBA - 如何停止在公衆假期工作的宏

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 

在此先感謝

+0

你是什麼意思「公共假期」?只有那些國定假日?哪些是在一些州的假期而不是其他的?區域性的? (也就是說,你是否在某個日期的某個地方列出了你認爲是「公共假期」的列表?如果是這樣,該列表在哪裏存儲?) – YowE3K

+0

@ YowE3K當我的意思是「公共假期」時,我的意思是國定假日。例如,「公衆假期」如聖誕節,新年日等。謝謝 – user7377729

+1

將您認爲假期的日期列表作爲數組實施。並實現第一行像循環循環通過一個數組包含所有的假期日期,如果日期匹配假期'日期'在數組中,然後'退出子' –

回答

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 

或者代替的/每個循環中,您可以使用VBA.Filter(如@RobinMackenzie指出了他的評論)。

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 

所有節假日都需要在arrHolidays中指定。如果Date是假期,那麼它將取消執行並Exit Sub


爲了從工作表加載假日日期「假日」列中的使用

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

注:這裏我們需要調換獲得一維數組出該範圍。

+1

你可以用'If UBound(VBA.Filter(arrHolidays,Date))來避免循環<1 Then ...' –

+0

@RobinMackenzie不錯,我不知道'VBA.Filter'。但它對我沒有用;你確定'<1'嗎?根據我的測試,它應該是'If UBound(VBA.Filter(arrHolidays,Date))> = 0然後退出Sub',因爲它是'-1',如果日期不在數組內並且'> = 0'日期至少存在一次。 –

+0

是的你是對的 - 我的代碼行表示'不匹配',但對於你的回答,你應該按照你所說的去做,並測試'> = 0'來表示'今天是公衆假期'。 –