Arrangements de jours/fichier

Bonjour,

Je fais appel à la Communauté.

J'ai soumis le fichier "circuit minutage hs jour à corriger" à Copilot et il me l'a organisé comme je le désirais sur base de mon prompt, cfr "circuits reorganises". Et ce, en quelques secondes.

En gros, les jours de mes circuits sont divisés en deux avec AM/PM et les heures de début/fin regroupées. Tout est en colonne plutôt qu'en lignes.

Pourriez-vous me dire comment Copilot a fait ? Car la procédure décrite est assez nébuleuse. Il m'a dit qu'il a fonctionné avec un tableau croisé dynamique mais je ne suis jamais parvenu au même résultat. Puis, il dévie, avec du code Python, que je ne maitrîse pas du tout.

Auriez-vous des astuces pour arriver un bon arrangement de mon fichier "circuit minutage" car je serai amené à devoir reproduire ce qui a été fait de façon autonome ? Qui plus est, en le faisant moi-même, je suis pratiquement certain d'avoir les bonnes infos.

Je vous remercie pour votre aide.

Bien à vous

Bonjour

Ci joint ma solution

A+ François

Bonjour,

Merci pour la proposition. Y'a-t-il la possibilité de faire cette transformation sans macro ?

Bonjour,

Voici ci-joint une proposition PowerQuery proposée par l'IA à partir de vos données et de la macro de François. NB : il y a une différence par rapport au résultat de François, les lignes vides (typiquement dans votre tableau la ligne 8 (brabant wallon - 1306R - Mercredi) sont ignorées alors que François vous les a retournées avec des 0. Je ne sais pas ce que vous préférez comme approche.

Si ce filtre ne vous convient pas vous pouvez retirer cette étape dans l'éditeur PowerQuery (étape 4 "Lignes non null"). Pour rafraichir les résultats, clic droit sur le tableau "tblRes" et Rafraichir.

EDIT : Peut-etre aussi à l'étape 7), vous nommez l'après midi "AM", j'ai l'impression qu'il y a une incohérence mais je l'ai gardée.

PS : sur Excel 2016 vous devez passer par un traitement automatique de données d'une manière ou d'une autre, faire cela via formules est de la folie (très lourd).

let
    // 1) Source : Table Excel
    Source = Excel.CurrentWorkbook(){[Name = "Tableau1"]}[Content],

    // 2) Nettoyage des textes vides -> null
    #"Textes vides en null" = Table.TransformColumns(
        Source,
        List.Transform(
            Table.ColumnNames(Source),
            (cn) => {cn, each if _ = "" then null else _, type text}
        )
    ),

    // 3) Dé-pivoter toutes les colonnes sauf Bureau/Circuit
    #"Dépivoté" = Table.UnpivotOtherColumns(
        #"Textes vides en null",
        {"Bureau", "Circuit"},
        "Attribut",
        "Plage"
    ),

    // 4) Filtrer les lignes sans horaire
    #"Lignes non null" = Table.SelectRows(
        #"Dépivoté",
        each [Plage] <> null and Text.Length(Text.Trim([Plage])) > 0
    ),

    // 5) Extraire codes jour ("Lu","Ma","Me","Je","Ve") et créneau ("AM","PM")
    #"JourCode" = Table.AddColumn(#"Lignes non null", "JourCode", each Text.Start([Attribut], 2), type text),
    #"CreneauCode" = Table.AddColumn(#"JourCode", "CreneauCode", each Text.End([Attribut], 2), type text),

    // 6) Jour en toutes lettres (FR)
    #"Jour FR" = Table.AddColumn(
        #"CreneauCode",
        "jour",
        each
            if [JourCode] = "Lu" then "LUNDI" else
            if [JourCode] = "Ma" then "MARDI" else
            if [JourCode] = "Me" then "MERCREDI" else
            if [JourCode] = "Je" then "JEUDI" else
            if [JourCode] = "Ve" then "VENDREDI" else [JourCode],
        type text
    ),

    // 7) Libellé créneau en FR (AM -> Matin ; PM -> Après-midi)
    #"Créneau FR" = Table.AddColumn(
        #"Jour FR",
        "Creneau",
        each if [CreneauCode] = "AM" then "Mat" else "AM",
        type text
    ),

    // 8) Séparer "06:50 - 08:45" en Début / Fin + conversion en type time
    #"Découpe Début/Fin" = Table.SplitColumn(
        #"Créneau FR",
        "Plage",
        Splitter.SplitTextByDelimiter(" - ", QuoteStyle.Csv),
        {"Début", "Fin"}
    ),
    #"En type heure" = Table.TransformColumnTypes(#"Découpe Début/Fin", {{"Début", type time}, {"Fin", type time}}),

    // 9) Colonnes utiles
    #"Colonnes utiles" = Table.SelectColumns(#"En type heure", {"Bureau","Circuit","jour","Creneau","Début","Fin"}),

    // 10) Agrégation pour obtenir 1 ligne par jour avec 4 colonnes d’heures
    #"Par jour" = Table.Group(
        #"Colonnes utiles",
        {"Bureau","Circuit","jour"},
        {
            {"debut Mat", each try List.First(Table.SelectRows(_, each [Creneau] = "Mat")[Début]) otherwise null, type time},
            {"Fin Mat",   each try List.First(Table.SelectRows(_, each [Creneau] = "Mat")[Fin])   otherwise null, type time},
            {"Debut AM",  each try List.First(Table.SelectRows(_, each [Creneau] = "AM")[Début])  otherwise null, type time},
            {"Fin AM",    each try List.First(Table.SelectRows(_, each [Creneau] = "AM")[Fin])    otherwise null, type time}
        }
    ),

    // 11) Total en minutes (gère les nulls)
    #"Total minutes" = Table.AddColumn(
        #"Par jour", "total_min",
        each
            let
                mMat = if [debut Mat] <> null and [Fin Mat] <> null then Duration.TotalMinutes([Fin Mat] - [debut Mat]) else 0,
                mPM  = if [Debut AM] <> null and [Fin AM] <> null then Duration.TotalMinutes([Fin AM] - [Debut AM])   else 0
            in mMat + mPM,
        type number
    ),

    // 12) Total formaté hh:mm
    #"Total hh:mm" = Table.AddColumn(
        #"Total minutes", "total",
        each
            let
                h  = Number.IntegerDivide([total_min], 60),
                mn = Number.Mod([total_min], 60)
            in Text.PadStart(Text.From(h), 2, "0") & ":" & Text.PadStart(Text.From(mn), 2, "0"),
        type text
    ),

    // 13) Ordre des jours pour tri LUNDI -> VENDREDI
    #"Ordre jour" = Table.AddColumn(
        #"Total hh:mm", "OrdreJour",
        each
            if [jour] = "LUNDI" then 1 else
            if [jour] = "MARDI" then 2 else
            if [jour] = "MERCREDI" then 3 else
            if [jour] = "JEUDI" then 4 else
            if [jour] = "VENDREDI" then 5 else 99,
        Int64.Type
    ),

    // 14) Colonnes finales + tri
    #"Colonnes finales" = Table.SelectColumns(#"Ordre jour", {"Bureau","Circuit","jour","debut Mat","Fin Mat","Debut AM","Fin AM","total","OrdreJour"}),
    #"Tri final" = Table.Sort(#"Colonnes finales", {{"Bureau", Order.Ascending}, {"Circuit", Order.Ascending}, {"OrdreJour", Order.Ascending}}),
    #"Sans OrdreJour" = Table.RemoveColumns(#"Tri final", {"OrdreJour"})
in
    #"Sans OrdreJour"

Bonjour à tous !

Une autre approche Power Query (liée à ma compréhension du besoin...) ?

Bonjour à tous,

Une autre approche power query.

Cordialement

Rechercher des sujets similaires à "arrangements jours fichier"