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
処理を丁寧に書けばこんな感じです
通報 ...