Fusion de tables

Accueil – Le CFO masqué Forums Excel Fusion de tables

  • Ce sujet contient 10 réponses, 2 participants et a été mis à jour pour la dernière fois par Christophe CARRE, le il y a 1 année et 2 mois.
11 sujets de 1 à 11 (sur un total de 11)
  • Auteur
    Articles
  • #125527
    Christophe CARRE
    Participant

    Bonjour,
    J’ai deux tables clients sur Excel issues de mon ERP : une table clients avec les adresses, téléphone etc… et une table avec les contacts par clients.
    La table clients ne contient qu’une ligne par clients et donc un client a plusieurs contacts.
    Je voudrais regrouper en 1 seule ligne les informations de la table client et les contacts. J’ai essayé avec Power Query avec une fusion gauche mais j’ai autant de lignes que de contacts.
    Je vous joins un extrait de mon fichier.
    Merci d’avance à toutes et tous pour votre aide.

    Attachments:
    You must be logged in to view attached files.
    #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

    #125547
    Christophe CARRE
    Participant

    Bonjour Stéphane,

    Je vous remercie pour votre réponse.
    Je voudrais avoir autant de colonnes que de contacts. J’ai modifié mon tableau Excel et dans l’onglet résultat, ce que je voudrais obtenir.

    Votre solution est de passer par du langage VBA ? Je ne connais pas du tout son utilisation et je crains de ne pouvoir appliquer votre solution à mon tableau..

    Christophe

    Attachments:
    You must be logged in to view attached files.
    #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

    #125619
    Christophe CARRE
    Participant

    Bonjour Stéphane,

    Je suis bloqué à l’étape ci-jointe par capture d’écran. Je n’arrive pas à avoir “Nom1”, “Adresse1” etc… Est-ce que je dois ajouter une colonne conditionnelle et fusionner les colonnes “contacts” et “Index” ? Quelles sont les colonnes à dépivoter à ce stade de la transformation ?
    Christophe

    Attachments:
    You must be logged in to view attached files.
    #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

    #125626
    Christophe CARRE
    Participant

    Stéphane,
    Je suis arrivé jusqu’à l’étape pivot. Je vous envoie la copie d’écran et le fichier Excel. Je n’arrive pas ensuite à avoir tous les contacts d’un même client sur une seule ligne après avoir pivoter la colonne attribut+index.
    J’ai dû mal faire quelque chose mais je ne sais pas quoi !
    Christophe

    Attachments:
    You must be logged in to view attached files.
    #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

    #125718
    Christophe CARRE
    Participant

    Bonjour Stéphane,
    Vous m’avez perdu dans le process. Si vous avez fait la transformation, pouvez-vous m’envoyer une copie d’écran des différentes étapes dans l’ordre chronologique ?
    Merci d’avance,
    Christophe.

    #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

    #125823
    Christophe CARRE
    Participant

    Bonjour Stéphane,
    Je vous remercie pour votre aide. Je ne sais pas comment intégrer votre code à Power Query. Faut-il passer par le menu “Affichage, Editeur avancé “?
    Je ne sais pas comment intégrer votre code au mien pour le faire fonctionner. Je ne connais pas assez le langage M pour cela. Je vous transmets mon code sur le document Word ci-joint.
    Pourriez-vous regarder ? Merci d’avance,
    Christophe.

    Attachments:
    You must be logged in to view attached files.
11 sujets de 1 à 11 (sur un total de 11)
  • Vous devez être connecté pour répondre à ce sujet.