実動日数を計算するには?

解決


若葉  2003-07-16 18:48:27  No: 78640

実動日数を計算したいのですがどのようにしたらいいのでしょうか?

  2003年8月1日〜2003年8月31日までの実動日数
  1.土日祝祭日は除く
  2.会社の指定休日は除く
    会社指定の盆休みが11日〜15日 

上記の場合、土日が10日,盆休みが5日あるので
実動日数 16日間を取得したいのですが・・・・。
土曜、日曜はWeekday(day)で判断できるみたいですが
指定休日の処理をどのようにしたらいいのか困っています。
どなたかご教授よろしくお願いいたします。


1412  2003-07-16 21:41:56  No: 78641

1日から31日まで1日ずつ、
1.『土日』かどうか
2.『祝祭日や会社指定の休日』かどうか
を調べていく必要があります。

1は WeekDay() で大丈夫ですけど、
2に関しては、自分でそういうコードを書く必要があります。


oku  URL  2003-07-17 10:37:14  No: 78642

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


oku  URL  2003-07-17 11:06:37  No: 78643

いつのまにか海の日と敬老の日が変わってた。
敬老の日は今年から九月の第三月曜日に変わってました。
海の日は今年から七月の第三月曜日になったんですね。
2001年で聞いてる所を2002年に変えてください。
申し訳m(__)m


oku  URL  2003-07-17 11:21:46  No: 78644

一応ソースは  こう変わります。
    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


Say  2003-07-17 20:13:57  No: 78645

今国会の法案で「みどりの日」が「昭和の日」に
「国民の休日」が「みどりの日」に変わりそうです。
このように、祝祭日は変更される可能性が高いので、
外部にデータとして持っておいたほうがいいのでは?

同様に会社指定休日も外部データで持っておいたほうが
いいでしょう。

ついでにそれらのメンテナンス画面があったほうが
いいでしょうが・・・。


若葉  2003-07-22 08:32:14  No: 78646

okuさん,1412さん,Sayさんアドバイス
ありがとうございます。今回はSayさんが言われるように
会社指定休日や祝祭日の変更に対応できるように
外部にデータを持つことにします。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加