IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Concaténer des lignes selon un critère


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Concaténer des lignes selon un critère
    Bonjour
    Je ne suis pas trop doué sur VBA, je recherche une macro pour concaténer des lignes selon le critère: avoir la même chaine de caractère sur sur colonneexemple.xlsxexemple.xlsx A par exemple.
    En pièce jointe un exemple.

    Merci d'avance de votre aide.

  2. #2
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 134
    Points : 84 790
    Points
    84 790
    Billets dans le blog
    15
    Par défaut
    Salut,

    Vous chez une macro, mais juste signaler également que vous pouvez y arriver avec un TCD
    Fichiers attachés Fichiers attachés
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci, mais je dois avoir des cases non fusionnées, ce qu'est pas possible avec un TDC. y a t il d autre méthode ou code ..

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    Une façon de faire en utilisant une macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Option Explicit
     
    '--- considère Colonne1 du Tableau1 triée
     
    Sub Concatener()
        Dim rT1 As Range, rT2 As Range, sC1 As String, kC As Integer
        Set rT1 = Range("Tableau1").Cells(1, 1)
        Set rT2 = Range("Tableau2").Cells(1, 1)
        If Range("Tableau2").Rows.Count > 1 Then Range("Tableau2").Delete   '--- vide Tableau2
        sC1 = rT1
        While rT1 <> ""
            rT2 = rT1
            For kC = 1 To 6
                rT2.Offset(0, kC) = rT2.Offset(0, kC) & rT1.Offset(0, kC) & vbLf
            Next kC
            Set rT1 = rT1.Offset(1, 0)
            If rT1 <> sC1 Then              '--- nouvelle valeur
                For kC = 1 To 6             '--- pour supprimer les vbLf inutiles
                    rT2.Offset(0, kC) = Left(rT2.Offset(0, kC), Len(rT2.Offset(0, kC)) - 1)
                Next kC
                sC1 = rT1
                Set rT2 = rT2.Offset(1, 0)
            End If
        Wend
    End Sub
    Cordialement.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci pour le macro, est ce que vous pouvez me dire svp comment je peux faire pour adapter la macro pour que elle fonctionne sur n importe quel fichier, avec un tableau plus grand ( plus de colonnes).

    Merci d'avance de votre aide

    Cordialement

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Le code proposé fonctionne pour n'importe quels tableaux. Il suffit que le premier soit nommé Tableau1 et que le second soit nommé Tableau2. Les noms des colonnes sont identiques et placées dans le même ordre.

    Cordialement.

  7. #7
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonjour

    En trois étapes avec Power Query. Le mieux étant d'avoir un tableau structuré au départ et des titres de colonnes

    1. Vous chargez vos données : Menu Données, A partir d'un tableau ou d'une plage

    2. Dans l'éditeur Power Query : vous sélectionnez la première colonne, menu Transformer, vous cliquez sur "Dépivoter les colonnes" et choisissez "dépivoter les autres colonnes" dans la liste proposée.
    Toutes vos colonnes avec le texte se retrouvent en ligne

    3. Et maintenant vous sélectionnez la colonne Attribut et vous la pivotez (menu Transformer, Pivoter la colonne) , vous choisissez "Valeur" dans la liste Colonne de Valeur.
    Par défaut il va compter le nombre de ligne avec le dernier argument = List.Count
    Vous remplacez List.Count par Text.Combine(_,"#(cr)") afin de joindre les textes avec un retour à la ligne

    Vous n'avez plus qu'à charger le résultat dans Excel.

    ça prend moins de temps à réaliser qu'à décrire les étapes comme je viens de le faire

    Stéphane

  8. #8
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 419
    Points : 16 262
    Points
    16 262
    Par défaut
    Bonjour à tous
    Citation Envoyé par jamal.obito Voir le message
    Merci, mais je dois avoir des cases non fusionnées, ce qu'est pas possible avec un TDC. y a t il d autre méthode ou code ..
    Alors pourquoi dans le résultat attendu tu as fusionné les cellules ?

    Je partage l'avis de Raccourcix
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  9. #9
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 419
    Points : 16 262
    Points
    16 262
    Par défaut
    Bonjour à tous
    Citation Envoyé par Raccourcix Voir le message
    Bonjour

    Vous remplacez List.Count par Text.Combine(_,"#(cr)") afin de joindre les textes avec un retour à la ligne
    Il me semble qu'il manque each
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplacez List.Count par each Text.Combine(_,"#(cr)")
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  10. #10
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    En complément à mon message #6, il faut effectivement adapter le nombre de colonnes (qui est de 6 dans l'exemple) par exemple utilisant .Columns.Count. Le code adapté à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Option Explicit
     
    '--- considère Colonne1 du Tableau1 triée
     
    Sub Concatener()
        Dim rT1 As Range, rT2 As Range, sC1 As String, kC As Integer, nC As Integer
        Set rT1 = Range("Tableau1").Cells(1, 1)
        Set rT2 = Range("Tableau2").Cells(1, 1)
        If Range("Tableau2").Rows.Count > 1 Then Range("Tableau2").Delete   '--- vide Tableau2
        sC1 = rT1
        nC = Range("Tableau1").Columns.Count - 1    '--- nombre de colonnes - 1
        While rT1 <> ""
            rT2 = rT1
            For kC = 1 To nC
                rT2.Offset(0, kC) = rT2.Offset(0, kC) & rT1.Offset(0, kC) & vbLf
            Next kC
            Set rT1 = rT1.Offset(1, 0)
            If rT1 <> sC1 Then                  '--- nouvelle valeur
                For kC = 1 To nC                '--- pour supprimer les vbLf inutiles
                    rT2.Offset(0, kC) = Left(rT2.Offset(0, kC), Len(rT2.Offset(0, kC)) - 1)
                Next kC
                sC1 = rT1
                Set rT2 = rT2.Offset(1, 0)
            End If
        Wend
    End Sub
    Maintenant, si vous utiliseriez Power Query plutôt que VBA, ce serait beaucoup mieux.

    Cordialement

  11. #11
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Citation Envoyé par 78chris Voir le message
    Bonjour à tous


    Il me semble qu'il manque each
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplacez List.Count par each Text.Combine(_,"#(cr)")
    bien évidemment qu'il manque le each, merci Chris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let
        Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
        Dépivot = Table.UnpivotOtherColumns(Source, {"Colonne1"}, "Attribut", "Valeur"),
        Pivot = Table.Pivot(Dépivot, List.Distinct(Dépivot[Attribut]), "Attribut", "Valeur", each Text.Combine(_,"#(cr)"))
    in
        Pivot
    éventuellement mettre #(lf) au lieu de #(cr). A tester

    Stéphane

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci pour l'astuce du Power Query, ça fonctionne bien pour les petits tableaux.
    J'ai un tableau d'environ 900 lignes/40 colonnes. ça fais 30 min que j essaye de charger le tableau et pour l instant ça beug pas mal.
    y t il une autre méthode.

    Merci encore de votre aide.

    Cordialement

  13. #13
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Autre possibilité pour éviter le dépivot, pivot

    créer une fonction nommée "Fn_concat" pour concaténer les colonnes d'une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = (Table as table)=> Table.FromRows({List.Transform( Table.ToColumns(Table) , each Text.Combine(_, "#(lf)"))})
    puis charger les données, regrouper par la 1er colonne et agréger "toutes les lignes"
    puis modifier l'étape pour appliquer la fonction à la colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let
        Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
        Groupe = Table.Group(Source, {"Colonne1"}, {{"Données", each Fn_concat(_)}}),
        Expand = Table.ExpandTableColumn(Groupe, "Données", {"Column2", "Column3", "Column4", "Column5", "Column6", "Column7"}, {"Column2", "Column3", "Column4", "Column5", "Column6", "Column7"})
    in
        Expand
    Stéphane

  14. #14
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Encore mieux pour ne pas avoir à lister toutes les colonnes

    La fonction "Fn_concat"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = (Table as table)=> Table.FromRows({List.Transform( Table.ToColumns(Table) , each Text.Combine(_, "#(lf)"))}, Table.ColumnNames(Table))
    et la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let
        Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
        Colonnes = List.Skip(Table.ColumnNames(Source),1),
        Groupe = Table.Group(Source, {"Colonne1"}, {{"Données", each Fn_concat(_)}}),
        Expand = Table.ExpandTableColumn(Groupe, "Données", Colonnes , Colonnes)
    in
        Expand
    le List.Skip pour retirer le nom de la première colonne

    Stéphane

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut gestion-agenda
    bonjour Malik voila j'ai un agenda Access et je tiens un salon de coiffure du coup pour mes rdv je me sert du logiciel mais le souci c'est qu'on est deux collaborateurs j'aimerais si c'est possible
    d'avoir une colonne pour moi et une pour mon collabo est ce possible vraiment ça m'aiderai beaucoup pouvez vous regardez ça merci d'avance.

Discussions similaires

  1. [XL-2016] Fusionner des lignes selon deux critères
    Par amayasanfield dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/09/2020, 10h43
  2. Concaténer des lignes selon un identifiant commun
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 02/02/2020, 12h17
  3. [XL-2010] Supprimer des lignes selon 3 critères et sur un onglet choisi
    Par breakage dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/10/2015, 07h29
  4. [Toutes versions] Macro pour sélectionner des lignes selon un critère
    Par logoyvelines dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/09/2011, 10h20
  5. [E-03] Macro Extraire des Lignes selon critère
    Par willybass dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/03/2009, 07h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo