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 Function

avec 2 fonctions qui ne sont pas de mon cru pour le calcul des jours fériés

Rechercher des sujets similaires à "planning interimaire"