Microsoft Access 掲示板

営業日ベースの日付の羅列から連続する開始日と終了日を計算 / 8

15 コメント
views
4 フォロー
8
hiroton 2022/09/17 (土) 07:39:39 f0ac9@2ee8f

肝となるのは

    ElseIf rs!休暇取得日 = 終了日 + 1 Then
        終了日 = 終了日 + 1
        rs.MoveNext
    Else
        If Is休日(終了日 + 1) Then
            終了日 = 終了日 + 1
        Else
            Debug.Print 終了日
            Debug.Print rs!氏名, rs!休暇取得日, ;
            終了日 = rs!休暇取得日
            rs.MoveNext
        End If
    End If

この部分ですね

変数のつくり方(数・名前)は非常に大事で、コードが複雑化する場合は、変数が適切か見直すと良いです。今回の終了日もコード上では実際の終了日を指すものではなく、一時的なデータとなっています(処理の結果、正式な終了日になる仮データ)
コードの処理に即して名前を付けるのであれば「終了日となりうる日付」で、もっと具体的に言えば「休日を考慮した連続した日付の最終日」です

これを使ってコードを組みなおすと

'//前のレコードと比較して「次の日か?」
    ElseIf rs!休暇取得日 = 休日を考慮した連続した日付の最終日 + 1 Then
    '//「次の日」なので連続した日付と終了日を更新する
        休日を考慮した連続した日付の最終日 = 休日を考慮した連続した日付の最終日 + 1
        終了日となりうる日付 = 休日を考慮した連続した日付の最終日
        rs.MoveNext
    Else
    '//日付が飛んだので休日を挟んでいないかチェック
        If Is休日(休日を考慮した連続した日付の最終日 + 1) Then
        '//休日だったので連続した日付と終了日を更新して、再チェック
        '//(レコードは進めずにループの先頭からやりなおし、更新した日付と現在のレコードの休暇取得日で再チェックする)
            休日を考慮した連続した日付の最終日 = 休日を考慮した連続した日付の最終日 + 1
            終了日となりうる日付 = 休日を考慮した連続した日付の最終日
        Else
        '//休日でなかった=現在のレコードは新しい休暇の区間なので、前の区間の終了日を決定する
            終了日 = 終了日となりうる日付

        '//前の区間の終了処理
            Debug.Print 終了日

        '//新しい区間の開始処理
            Debug.Print rs!氏名, rs!休暇取得日, ;
            終了日 = rs!休暇取得日
            rs.MoveNext
        End If
    End If

処理を丁寧に書けばこんな感じです

通報 ...