Bonjour,
Une proposition via PowerQuery et l'utilisation de tableaux structurés. Dans la feuille "Heures_nuit" il faut faire clic droit > Actualiser (ou rafraichir je ne sais plus le terme exact) pour mettre à jour le tableau.
NB : pour ne pas alourdir le forum je n'ai laissé que 100 lignes dans votre fichier, veuillez copier/coller votre tableau complet puis actualiser la requête pour retrouver vos résultats.
La requête (IA) :
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Typed = Table.TransformColumnTypes(Source, {
{"Matricule", Int64.Type},
{"PBeg1 (Entrée Site)", type number},
{"PEnd1 (Sortie pour Repas)", type number},
{"PBeg2 (Entrée du Repas)", type number},
{"PEnd2 (Sortie Site)", type number}
}),
// 3) Fonction de chevauchement entre 2 intervalles [a,b] et [c,d]
Overlap = (a as nullable number, b as nullable number, c as number, d as number) as number =>
let
inter = if a = null or b = null
then 0
else List.Min({b, d}) - List.Max({a, c})
in
if inter > 0 then inter else 0,
// 4) Fin du 1er intervalle: PEnd1 si présent, sinon PEnd2 (pas de pause)
AddEnd1 = Table.AddColumn(Typed, "End1", each
if [#"PEnd1 (Sortie pour Repas)"] = null
then [#"PEnd2 (Sortie Site)"]
else [#"PEnd1 (Sortie pour Repas)"],
type number
),
// 5) Indicateur pause
AddHasLunch = Table.AddColumn(AddEnd1, "HasLunch", each
[#"PEnd1 (Sortie pour Repas)"] <> null and
[#"PBeg2 (Entrée du Repas)"] <> null and
[#"PEnd2 (Sortie Site)"] <> null,
type logical
),
// 6) Heures de nuit = chevauchement avec [0,5] + [24,29]
AddNight = Table.AddColumn(AddHasLunch, "Heures_nuit", each
// Intervalle avant la pause (ou tout l'amplitude s'il n'y a pas de pause)
Overlap([#"PBeg1 (Entrée Site)"], [End1], 0, 5) +
Overlap([#"PBeg1 (Entrée Site)"], [End1], 24, 29) +
// Intervalle après la pause (uniquement si pause)
( if [HasLunch]
then Overlap([#"PBeg2 (Entrée du Repas)"], [#"PEnd2 (Sortie Site)"], 0, 5)
+ Overlap([#"PBeg2 (Entrée du Repas)"], [#"PEnd2 (Sortie Site)"], 24, 29)
else 0 ),
type number
),
Result = Table.RemoveColumns(AddNight, {"End1", "HasLunch"})
in
Result