Planning intérimaire
Merci Steelson en tout cas pour ta patience et ton travail acharné lol !
En faite je cherche pas à avoir un truc précis mais quelque chose qui ce rapproche !
Après si ça reste compliqué te casse pas la tête non plus !
Bonjour,
Je reviens sur le sujet avec une nouvelle version puisque quelqu'un m'a demandé de prévoir plusieurs boites d'intérim avec des taux différents.
J'en ai profité pour reprendre la structure du document.
Le calcul étant tellement complexe que j'ai préféré exceptionnellement le basculer en VBA.
Données d'entrée colonnes A, B, C, D, E : jour - heure début - heure début pause - heure fin pause - heure fin
Sorties F, G, H, I : heures nuit, heures jour, heures dimanche, heures férié (tout hors pause décomptée)
La règle adoptée est celle du taux le plus favorable pour l'intérimaire, donc ici les heures en jour férié sont prépondérantes, puis la nuit, puis le dimanche
Option Explicit
Public Type vacation
jour As Date
nuit As Date
dimanche As Date
ferie As Date
End Type
Sub calculer(i As Integer)
Dim j As Date, d As Date, f As Date
' avant pause après pause
Dim resultat As vacation, avantPause As vacation, apresPause As vacation
With resultat
.jour = 0
.nuit = 0
.dimanche = 0
.ferie = 0
End With
If Range("B" & i).Value = "" Then GoTo erreur
If Range("B" & i).Value = "" Xor Range("E" & i).Value = "" Then GoTo erreur
If Range("C" & i).Value = "" Then
' sans pause
j = Range("A" & i).Value
d = Range("B" & i).Value
f = Range("E" & i).Value
resultat = vct(j, d, f)
Else
' avec pause
If Range("C" & i).Value = "" Xor Range("D" & i).Value = "" Then GoTo erreur
j = Range("A" & i).Value
d = Range("B" & i).Value
f = Range("C" & i).Value
avantPause = vct(j, d, f)
j = Range("A" & i).Value + IIf(Range("D" & i).Value < Range("B" & i).Value, 1, 0)
d = Range("D" & i).Value
f = Range("E" & i).Value
apresPause = vct(j, d, f)
With resultat
.jour = .jour + avantPause.jour + apresPause.jour
.nuit = .nuit + avantPause.nuit + apresPause.nuit
.dimanche = .dimanche + avantPause.dimanche + apresPause.dimanche
.ferie = .ferie + avantPause.ferie + apresPause.ferie
End With
End If
erreur:
With resultat
Range("F" & i).Value = .jour * 24
Range("G" & i).Value = .nuit * 24
Range("H" & i).Value = .dimanche * 24
Range("I" & i).Value = .ferie * 24
End With
End Sub
Function vct(j As Date, d As Date, f As Date) As vacation
' jour, debut, fin
Dim jour1 As Date, debut1 As Date, fin1 As Date, plage1 As vacation ' première journée jusque minuit le cas échéant
Dim jour2 As Date, debut2 As Date, fin2 As Date, plage2 As vacation ' deuxième journée le cas échéant
jour1 = j: debut1 = d: fin1 = IIf(f < d, 1, f): plage1 = routine(jour1, debut1, fin1)
jour2 = j + IIf(f < d, 1, 0): debut2 = 0: fin2 = IIf(f < d, f, 0): plage2 = routine(jour2, debut2, fin2)
With vct
.jour = .jour + plage1.jour + plage2.jour
.nuit = .nuit + plage1.nuit + plage2.nuit
.dimanche = .dimanche + plage1.dimanche + plage2.dimanche
.ferie = .ferie + plage1.ferie + plage2.ferie
End With
End Function
Function routine(jour As Date, debut As Date, fin As Date) As vacation
Dim finNuit As Date, debNuit As Date
finNuit = Sheets("parametres").Range("finNuit")
debNuit = Sheets("parametres").Range("debNuit")
With routine
' nuit
.nuit = 0
If fin > debNuit Then .nuit = .nuit + fin - Application.Max(debNuit, debut)
If debut < finNuit Then .nuit = .nuit + Application.Min(fin, finNuit) - debut
' jour
.jour = fin - debut - .nuit
' majorations férié > nuit > dimanche, donc
' si férié, les heures de nuit et de jour y sont affectées
.ferie = 0
If IsFerie(jour) Then
.ferie = .jour + .nuit
.jour = 0
.nuit = 0
End If
' si dimanche et non férié, les heures de jour y sont affectées
.dimanche = 0
If (Weekday(jour, vbMonday) = 7) And Not IsFerie(jour) Then
.dimanche = .jour
.jour = 0
End If
End With
End Functionavec 2 fonctions qui ne sont pas de mon cru pour le calcul des jours fériés