実動日数を計算したいのですがどのようにしたらいいのでしょうか?
例
2003年8月1日〜2003年8月31日までの実動日数
1.土日祝祭日は除く
2.会社の指定休日は除く
会社指定の盆休みが11日〜15日
上記の場合、土日が10日,盆休みが5日あるので
実動日数 16日間を取得したいのですが・・・・。
土曜、日曜はWeekday(day)で判断できるみたいですが
指定休日の処理をどのようにしたらいいのか困っています。
どなたかご教授よろしくお願いいたします。
1日から31日まで1日ずつ、
1.『土日』かどうか
2.『祝祭日や会社指定の休日』かどうか
を調べていく必要があります。
1は WeekDay() で大丈夫ですけど、
2に関しては、自分でそういうコードを書く必要があります。
2年程前にカレンダーソフトみたいなものを
作ったときのソースがまだあったので、
それにちょっと手を加えて
祝祭日を判断する物をここに書きます。
ちなみに春分の日と秋分の日は特殊な祝日なので
(天文学的に、太陽の位置を精密に求めなければわからないので)
いつまでこれであってるかは忘れました。
たしか2099年までこれで良かったはず。(^_^;)
Private Function Holiday(pDate As Date) As String
Dim HDayName(14) As String
Dim HDayList(14) As Date
Dim TempDate As Date
Dim intYear As Integer
Dim intindex As Integer
intYear = Year(pDate)
'*******************
'* 祝日の設定 *
'*******************
HDayName(0) = "元旦"
HDayList(0) = DateSerial(intYear, 1, 1)
HDayName(1) = "成人の日"
If intYear <= 1999 Then
HDayList(1) = DateSerial(intYear, 1, 15)
Else
TempDate = DateSerial(intYear, 1, 1)
HDayList(1) = TempDate - Weekday(TempDate) _
+ IIf(Weekday(TempDate) <= 2, 9, 16)
End If
HDayName(2) = "建国記念の日"
HDayList(2) = DateSerial(intYear, 2, 11)
HDayName(3) = "春分の日"
HDayList(3) = DateSerial(intYear, 3, Fix(20.8431 _
+ 0.242194 * (intYear - 1980) - Fix((intYear - 1980) / 4)))
HDayName(4) = IIf(intYear <= 1988, "天皇誕生日", "みどりの日")
HDayList(4) = DateSerial(intYear, 4, 29)
HDayName(5) = "憲法記念日"
HDayList(5) = DateSerial(intYear, 5, 3)
HDayName(6) = "国民の休日"
HDayList(6) = DateSerial(intYear, 5, 4)
HDayName(7) = "こどもの日"
HDayList(7) = DateSerial(intYear, 5, 5)
HDayName(8) = "海の日"
If intYear <= 2001 Then
HDayList(8) = IIf(intYear <= 1995, 0, DateSerial(intYear, 7, 20))
Else
TempDate = DateSerial(intYear, 7, 1)
HDayList(8) = TempDate - Weekday(TempDate) _
+ IIf(Weekday(TempDate) <= 2, 9, 23)
End If
HDayName(9) = "敬老の日"
HDayList(9) = DateSerial(intYear, 9, 15)
HDayName(10) = "秋分の日"
HDayList(10) = DateSerial(intYear, 9, Fix(23.2488 _
+ 0.242194 * (intYear - 1980) - Fix((intYear - 1980) / 4)))
HDayName(11) = "体育の日"
If intYear <= 1999 Then
HDayList(11) = DateSerial(intYear, 10, 10)
Else
TempDate = DateSerial(intYear, 10, 1)
HDayList(11) = TempDate - Weekday(TempDate) _
+ IIf(Weekday(TempDate) <= 2, 9, 16)
End If
HDayName(12) = "文化の日"
HDayList(12) = DateSerial(intYear, 11, 3)
HDayName(13) = "勤労感謝の日"
HDayList(13) = DateSerial(intYear, 11, 23)
HDayName(14) = "天皇誕生日"
HDayList(14) = IIf(intYear <= 1988, 0, DateSerial(intYear, 12, 23))
'*******************
'* 祝日の判断 *
'*******************
For intindex = 0 To UBound(HDayName)
If pDate = HDayList(intindex) Then
Holiday = HDayName(intindex)
Exit Function
End If
Next intindex
'**********************
'* 振替休日の判断 *
'**********************
If Weekday(pDate) = vbMonday Then
For intindex = 0 To UBound(HDayName)
If pDate - 1 = HDayList(intindex) Then
Holiday = "振替休日"
Exit Function
End If
Next intindex
End If
'************************************
'* 祝日が見つからなかった時の処理 *
'************************************
Holiday = ""
End Function
このプロシージャに日付を渡せば祝日の名前が返ってきます。
ちなみにプロジェクトを下に置いておきます。
http://oku_newtype.tripod.co.jp/calendar.lzh
「春分の日」と「秋分の日」の計算方法が載っているところ。
http://www.threeweb.ad.jp/~center/shunbun.html
いつのまにか海の日と敬老の日が変わってた。
敬老の日は今年から九月の第三月曜日に変わってました。
海の日は今年から七月の第三月曜日になったんですね。
2001年で聞いてる所を2002年に変えてください。
申し訳m(__)m
一応ソースは こう変わります。
HDayName(8) = "海の日"
If intYear <= 2002 Then
HDayList(8) = IIf(intYear <= 1995, 0, DateSerial(intYear, 7, 20))
Else
TempDate = DateSerial(intYear, 7, 1)
HDayList(8) = TempDate - Weekday(TempDate) _
+ IIf(Weekday(TempDate) <= 2, 9, 23)
End If
HDayName(9) = "敬老の日"
If intYear <= 2002 Then
HDayList(9) = DateSerial(intYear, 9, 15)
Else
TempDate = DateSerial(intYear, 9, 1)
HDayList(9) = TempDate - Weekday(TempDate) _
+ IIf(Weekday(TempDate) <= 2, 16, 23)
End If
プロジェクトも修正して上げ直しました。
もしほかにも間違いがあったら教えてくださいm(__)m
今国会の法案で「みどりの日」が「昭和の日」に
「国民の休日」が「みどりの日」に変わりそうです。
このように、祝祭日は変更される可能性が高いので、
外部にデータとして持っておいたほうがいいのでは?
同様に会社指定休日も外部データで持っておいたほうが
いいでしょう。
ついでにそれらのメンテナンス画面があったほうが
いいでしょうが・・・。
okuさん,1412さん,Sayさんアドバイス
ありがとうございます。今回はSayさんが言われるように
会社指定休日や祝祭日の変更に対応できるように
外部にデータを持つことにします。
本当にありがとうございました。
ツイート | ![]() |