Toutes mes réponses sur les forums

15 sujets de 16 à 30 (sur un total de 283)
  • Auteur
    Messages
  • Stéphane Lorin
    Participant

    Bonjour
    Attention : le 3e argument de #duration correspond aux minutes et non aux jours.
    Vous ajoutez 7 min et non 7 jours
    Stéphane

    en réponse à : Regroupement de lignes #126662
    Stéphane Lorin
    Participant

    Bonjour

    Je pense qu’il est plus simple de créer une fonction personnalisée
    Vous appliquez ensuite cette fonction lors du regroupement

    la fonction “Dépivot” :

    (Données as table) as table =>
    let
    Index = Table.AddIndexColumn(Données, “Index”, 1, 1, Int64.Type),
    UnPivot = Table.UnpivotOtherColumns(Index, {“CodeClient”, “Index”}, “Attribut”, “Valeur”),
    Attribut = Table.CombineColumns(Table.TransformColumnTypes(UnPivot, {{“Index”, type text}}, “fr”),{“Attribut”, “Index”},Combiner.CombineTextByDelimiter(” “, QuoteStyle.None),”Attribut.1”),
    Pivot = Table.Pivot(Attribut, List.Distinct(Attribut[Attribut.1]), “Attribut.1”, “Valeur”)
    in
    Pivot

    A appliquer manuellement dans le Group

    Table.Group(Etape-Précédente, {“CodeClient”}, {{“Données”, each Dépivot(_)}})

    il ne reste plus qu’à développer les colonnes

    Stéphane

    en réponse à : Table absente #126230
    Stéphane Lorin
    Participant

    Bonjour

    vous dites “si la table est absente du dossier”
    une table est un élément d’un fichier Excel qui est lui-même enregistré dans un dossier (ou sous-dossier).
    vous cherchez le nom d’une table dans tous les fichiers du dossier ?

    Sinon vous pouvez utiliser try … otherwise … afin de passer à l’étape suivante.

    Stéphane

    en réponse à : Aide avec powerquery #125863
    Stéphane Lorin
    Participant

    Bonjour

    si vous avez Excel 365, je vous propose

    =TRIER(FILTRE(planning[[Colonne1]:[Colonne17]];NB.SI(planning[[Colonne1]:[Colonne17]];planning[[Colonne1]:[Colonne17]])=1);;;VRAI)

    Cela va prendre les valeurs uniques et les trier dans l’ordre croissant

    Stéphane

    en réponse à : Fusion de tables #125734
    Stéphane Lorin
    Participant

    Comme je l’écrivais tout à l’heure, je n’ai pas accès à votre base et votre requête commence par

    Source = Excel.Workbook(File.Contents(“\\datas\profils$\Administration\Desktop\Fusion contacts2.xlsx”), null, true)

    J’ai donc une erreur à l’ouverture, si vous voulez de l’aide il faut fournir un fichier exploitable

    Voici un code qui fonctionne mais il faudra l’adapter à votre source (1er étape)

    let
    Source = Excel.CurrentWorkbook(){[Name=”Table_Contacts”]}[Content],
    #”Lignes groupées” = Table.Group(Source, {“CodeClient”}, {{“Nombre”, each Table.AddIndexColumn(_,”Index”,1), type table }}),
    #”Nombre développé” = Table.ExpandTableColumn(#”Lignes groupées”, “Nombre”, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}),
    #”Supprimer le tableau croisé dynamique des autres colonnes” = Table.UnpivotOtherColumns(#”Nombre développé”, {“CodeClient”, “Index”}, “Attribut”, “Valeur”),
    #”Colonnes fusionnées” = Table.CombineColumns(Table.TransformColumnTypes(#”Supprimer le tableau croisé dynamique des autres colonnes”, {{“Index”, type text}}, “fr”),{“Attribut”, “Index”},Combiner.CombineTextByDelimiter(” “, QuoteStyle.None),”Attribut.1″),
    #”Colonne dynamique” = Table.Pivot(#”Colonnes fusionnées”, List.Distinct(#”Colonnes fusionnées”[Attribut.1]), “Attribut.1”, “Valeur”)
    in
    #”Colonne dynamique”

    Stéphane

    en réponse à : Fusion de tables #125698
    Stéphane Lorin
    Participant

    Bonjour

    votre fichier pointe vers une source externe que je ne peux évidemment pas ouvrir.
    il faut créer un tableau dans votre fichier exemple et partir de ce tableau Contacts

    A la lecture du code je vois que vous ajoutez l’index après le développement des colonnes regroupées, je vous expliquais hier de créer l’index sur chaque table du regroupement

    Table.Group(Source, {“CodeClient”}, {{“Données”, each Table.AddIndexColumn(_,”Index”,1)}})

    Stéphane

    en réponse à : Ajout automatique de colonnes calculées #125695
    Stéphane Lorin
    Participant

    Bonjour
    C’est possible, voir exemple en PJ
    Vous ajoutez un index, vous dépivotez toutes vos colonnes, puis vous pivotez 2 par 2 pour faire vos contrôles et vous pivotez de nouveau pour récupérer les 15 contrôles.
    Il ne reste plus qu’à fusionner les contrôles avec votre source initiale

    A adapter à vos données
    Stéphane

    Attachments:
    You must be logged in to view attached files.
    en réponse à : Fusion de tables #125623
    Stéphane Lorin
    Participant

    Regardez l’étape Regroupement de mon code ci-dessus
    Table.Group(Source, {“CodeClient”}, {{“Données”, each Table.AddIndexColumn(_,”Index”,1)}})

    Je modifie le code manuellement en ajoutant l’index à chaque table (avant le développement des colonnes), comme ça il y a un contact 1, 2, 3… pour chaque client.

    Ensuite à l’étape dépivot, on conserve les codes clients et l’index et on dépivote toutes les autres colonnes, en attribut on a maintenant Nom, Adresse, Fonction…
    Puis on combine les colonnes Attribut et Index pour avoir Nom1, Adresse1, Fonction1, Nom2, Adresse2,…
    Enfin on pivote cette colonne Attribut+Index pour avoir en colonne Nom1, Adresse1, Fonction1, Nom2, Adresse2,…

    Stéphane

    en réponse à : Fusion de tables #125613
    Stéphane Lorin
    Participant

    Bonjour

    Le code proposé est bien du Power Query (langage M) et non en VBA

    Il faut commencer par stocker vos données dans des tableaux “structurés” (insertion/tableau)

    Ce que vous souhaitez est une transformation assez “classique” qui revient régulièrement sur les forums.

    Une possibilité est de regrouper votre table “contacts” par Codeclient, d’ajouter un Index afin de numéroter les contacts, de dépivoter les colonnes pour obtenir “Nom1”, “Adresse1″, Fonction1”, “Nom2″, Adresse2”, “Fonction2″… Enfin vous pivoter l’ensemble pour obtenir une ligne par Codeclient.
    La dernière étape est une fusion entre votre table “Clients” et votre table “Contacts” transformée.

    Voici le code Power Query pour transformer la table “Contacts”

    let
    Source = Excel.CurrentWorkbook(){[Name=”Contacts”]}[Content],
    Regroupement = Table.Group(Source, {“CodeClient”}, {{“Données”, each Table.AddIndexColumn(_,”Index”,1)}}),
    Développement = Table.ExpandTableColumn(Regroupement, “Données”, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}),
    Dépivot = Table.UnpivotOtherColumns(Développement, {“CodeClient”, “Index”}, “Attribut”, “Valeur”),
    #”Fusion Colonne” = Table.CombineColumns(Table.TransformColumnTypes(Dépivot, {{“Index”, type text}}, “fr-FR”),{“Attribut”, “Index”},Combiner.CombineTextByDelimiter(” “, QuoteStyle.None),”Attribut.1″),
    Pivot = Table.Pivot(#”Fusion Colonne”, List.Distinct(#”Fusion Colonne”[Attribut.1]), “Attribut.1”, “Valeur”)
    in
    Pivot

    Stéphane

    en réponse à : Fusion de tables #125546
    Stéphane Lorin
    Participant

    Bonjour

    vous ne précisez pas comment vous voulez regrouper les contacts en une seule ligne par client :
    en collant les noms les uns derrière les autres,
    en créant autant de colonnes que de contact
    en créant des colonnes suivant la fonction

    voici exemple de code avec un regroupement pour créer une liste.

    let
    Source = Excel.CurrentWorkbook(){[Name=”Contacts”]}[Content],
    #”Lignes groupées” = Table.Group(Source, {“CodeClient”}, {{“Contact”, each [NomContact], type list}})
    in
    #”Lignes groupées”

    Vous pouvez ensuite développer la liste sur des colonnes ou la concaténer.
    Vous réaliserez la fusion avec la table des clients dans une autre requête.

    Stéphane

    en réponse à : Ajouter jours ouvrés #124696
    Stéphane Lorin
    Participant

    Bonjour

    La réponse de ChatGPT est assez bluffante mais je doute que ça renvoi le résultat attendu en l’état. je ne trouve pas la fonction Date.IsWorkday dans Power Query (pas présente sur le site https://learn.microsoft.com/fr-fr/powerquery-m) et la fonction va renvoyer le dernier jour ouvré dans les trois jours suivant la date demandée.

    Je propose pour ma part de créer une nouvelle colonne avec une liste de date de 10 jours (pour être large !), de ne conserver que les jours de la semaine et ceux qui ne sont pas fériés. puis de sélectionner le 3e jour (donc le 2 car power query commence les listes à 0)

    each List.Select(List.Dates(Date.AddDays([Date],1),10,#duration(1,0,0,0)),each Date.DayOfWeek(_, Day.Monday)<5 and List.IsEmpty(List.Intersect({Fériés, {_}}))){2}

    avec les dates initiales dans le champ [Date] et la liste “Fériés” désignant les jours fériés.

    Stéphane

    en réponse à : Ne traiter que les fichiers modifiés #124578
    Stéphane Lorin
    Participant

    Dans ce que j’en ai compris, Power Query ne traite pas le code dans l’ordre mais n’exécute que le nécessaire.
    Si la condition est remplie les dernières lignes de code ne seront pas exécutées.

    if Table.IsEmpty(#”Lignes filtrées3″) then MyTable0 else #”Lignes vides supprimées”

    Sinon voici ma fonction n° de semaine adaptée avec le n° du jour de la semaine au format 2023-W02-4 pour ce 12 janvier 2023 (4eme jour de la 2eme semaine de l’année)

    (Date as date) => let
    Jour_Semaine = Date.DayOfWeek(Date,Day.Monday),
    Jeudi_Semaine = Date.AddDays(Date,3-Jour_Semaine),
    Premier_Jeudi_Année = #date(Date.Year(Jeudi_Semaine),1,7-Date.DayOfWeek(#date(Date.Year(Jeudi_Semaine),1,1),Day.Friday)),
    Num_Semaine = Duration.Days(Jeudi_Semaine – Premier_Jeudi_Année)/7+1
    in
    Text.From(Date.Year(Jeudi_Semaine))&”-W”&Text.PadStart(Text.From(Num_Semaine),2,”0″)&”-“&Text.From(Jour_Semaine+1)

    Stéphane

    en réponse à : Ne traiter que les fichiers modifiés #124572
    Stéphane Lorin
    Participant

    Bonjour

    Difficile de comprendre votre code, nous n’avons pas accès aux sources. Attention tout de même aux données confidentielles.

    Vous pouvez utiliser Table.IsEmpty pour tester si votre table est vide.

    dans le “in” final, if Table.IsEmpty SourceBefore then … else #”Lignes vides supprimées”

    Sinon j’ai proposé dans cette discussion https://www.lecfomasque.com/sujet/numero-semaine-iso/ une fonction N° Semaine Iso bien plus simple que celle que vous utilisez.

    Stéphane

    en réponse à : résultat d’aujourd’hui moins le résultat d’hier #124388
    Stéphane Lorin
    Participant

    Bonjour

    Je vous ai proposé une autre possibilité sur un autre forum sans réponse de votre part. Inutile de poser votre question à plusieurs endroits si c’est pour ignorer leur réponse.

    Il me semble plus facile de mettre en œuvre une solution par fusion via une colonne personnalisée en ajoutant la date de la veille (et une colonne d’Index pour le tri)

    Voici le code

    let
    Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
    ModificationTypeData = Table.TransformColumnTypes(Source,{{“Date”, type date}, {“type”, type text}, {“valeur”, Int64.Type}}),
    #”Index ajouté” = Table.AddIndexColumn(ModificationTypeData, “Index”, 0, 1, Int64.Type),
    #”Personnalisée ajoutée” = Table.AddColumn(#”Index ajouté”, “Veille”, each Date.AddDays([Date],-1)),
    #”Requêtes fusionnées” = Table.NestedJoin(#”Personnalisée ajoutée”, {“Veille”, “type”}, #”Personnalisée ajoutée”, {“Date”, “type”}, “Personnalisée ajoutée”, JoinKind.LeftOuter),
    #”Personnalisée ajoutée développé” = Table.ExpandTableColumn(#”Requêtes fusionnées”, “Personnalisée ajoutée”, {“valeur”}, {“valeur veille”}),
    #”Soustraction insérée” = Table.AddColumn(#”Personnalisée ajoutée développé”, “Ecart”, each [valeur] – [valeur veille], Int64.Type),
    #”Lignes triées” = Table.Sort(#”Soustraction insérée”,{{“Index”, Order.Ascending}}),
    #”Autres colonnes supprimées” = Table.SelectColumns(#”Lignes triées”,{“Date”, “type”, “valeur”, “Ecart”})
    in
    #”Autres colonnes supprimées”

    Stéphane

    en réponse à : Compter le nombre de lignes #122568
    Stéphane Lorin
    Participant

    Bonjour

    quelque chose comme
    =C2&”-“&NB.SI.ENS(C$2:C2;C2)

    Si vous avez une volumétrie importante de données, il est intéressant d’utiliser Power Query pour transformer vos données

    Stéphane

15 sujets de 16 à 30 (sur un total de 283)