patrice33740 Avec la réponse, c'est facile. | Bonjour,
Une proposition :
Code :
- Option Explicit
- Sub Test()
- '
- Dim hreDebOuvert As Date
- Dim hreFinOuvert As Date
- Dim datHreDeb As Date
- Dim datHreFin As Date
- Dim hreDeb As Date
- Dim hreFin As Date
- Dim datDeb As Date
- Dim datFin As Date
- Dim hreDif As Date
- Dim nbrJrs As Long
- Dim noJDeb As Integer
- Dim noJFin As Integer
- Dim nbrSem As Integer
- Dim result As String
-
- ' Heures ouvrées
- hreDebOuvert = #8:00:00 AM#
- hreFinOuvert = #6:00:00 PM#
-
- ' Période concernée
- datHreDeb = #1/17/2020 4:00:00 PM#
- datHreFin = #1/20/2020 9:00:00 AM#
-
- ' Séparer dates et heures
- datDeb = Int(datHreDeb)
- datFin = Int(datHreFin)
- hreDeb = datHreDeb - datDeb
- hreFin = datHreFin - datFin
- ' Contrôle dates période
- If datHreFin < datHreDeb Then
- MsgBox "La fin de la période doit être supérieure ou égale au début de la période", vbCritical
- Exit Sub
- End If
- noJDeb = (datDeb + 5) Mod 7
- noJFin = (datFin + 5) Mod 7
- If noJDeb > 4 Or noJFin > 4 Then
- MsgBox "Le début et la fin de période doit être pendant les heures ouvrées", vbCritical
- Exit Sub
- End If
- ' Reliquat d'heures
- If hreDeb > hreFin Then
- hreDif = hreFinOuvert - hreDeb
- hreDeb = hreDebOuvert
- datDeb = datDeb + 1
- End If
- hreDif = hreDif + hreFin - hreDebOuvert
- ' Nombre de semaines
- nbrJrs = datFin - datDeb
- nbrSem = Int(nbrJrs / 7)
- ' Reliquat jours
- noJDeb = (datDeb + 5) Mod 7
- nbrJrs = nbrJrs Mod 7
- If noJDeb + nbrJrs > 4 Then nbrJrs = nbrJrs - 2 'WE
- nbrJrs = nbrJrs + 5 * nbrSem
- ' Résultat
- result = nbrJrs & " j. " & Hour(hreDif) & " h. " & Minute(hreDif) & " min."
-
- MsgBox Format(datHreDeb, "ddd dd mmm yyyy" ) & vbCrLf & _
- Format(datHreFin, "ddd dd mmm yyyy" ) & vbCrLf & _
- result
-
- End Sub
|
Ne faudrait-il pas aussi tenir compte des jours fériés ?
---------------
Cordialement, Patrice
|