HOME > 即効テクニック > AccessVBA > 日付・文字列操作・演算 > 指定した期間内に、特定の曜日が何回あるかを取得する関数

即効テクニック

日付・文字列操作・演算

指定した期間内に、特定の曜日が何回あるかを取得する関数

(Access 97)
● 概要 ●
この関数は、引数で指定された期間内に、どの曜日が何回あったかを取得するものです。

● サンプルコード ●
汎用関数ですので、標準プロシージャに以下のコードを記述して下さい。

'引数説明
'dtStart    :期間開始日
'dtEnd      :期間終了日
'iWeekDay   :求めたい曜日
'    1=日曜日 2=月曜日 3=火曜日 4=水曜日 5=木曜日
'    6=金曜日 7=土曜日 VBの曜日定数でも可(vbSundayなど)
Public Function GetWeekDay(ByVal dtStart As Date, ByVal dtEnd As Date, _
                           iWeekday As Integer) As Long
    Dim lngDay    As Long      '期間の日数
    Dim lngWeek   As Long      '週の数
    Dim lngRest   As Long      '週の余りの数
    Dim lngEndDay As Long      '期間の終わりの曜日

    '計算処理
    '期間の日数を取得
    lngDay = DateDiff("d", dtStart, dtEnd) + 1

    '週の数を取得
    lngWeek = Int(lngDay / 7)

    '余った日を取得
    lngRest = lngDay - lngWeek * 7

    '終了日の曜日を取得
    lngEndDay = Weekday(dtEnd, iWeekday)

    '条件判断
    If lngEndDay > lngRest Then
        GetWeekDay = lngWeek
    Else
        GetWeekDay = lngWeek + 1
    End If
End Function


● 動作確認 ●
以下のコードを標準モジュールに記述し、実行して下さい。

Private Sub test()
    Debug.Print GetWeekDay(#1/1/1901#, #12/31/2000#, vbSunday)
End Sub

  イミディエイトウィンドウに「5218」と表示されます。
  どうやら20世紀には、日曜日が5218回あるようです。


● 詳細 ●
サンプルでは、引数によって指定された期間の日数を計算し、週の数と余りの日数を求め、最後に終了日と余りの日数を比較することで、特定の曜日の数を取得しています。

処理のポイントは「iEndDay = Weekday(dtEnd, iWeekday)」ですね。
求めたい曜日を基準に期間終了日の曜日を取得し、7で割り切れなかった余りの日数との差を計算しています。

なお、このサンプルでは引数の期間開始日、期間終了日共に「含めた」状態で計算します。
また、日付リテラル文字は米国式に「mm/dd/yyyy」と記述しています。
「yyyy/mm/dd」でも問題なく動作しますが、JETエンジンは基本的に米国式の日付を扱いますので、米国式で記述するようにして下さい。