Excel-VBA : Concatener cellules selon critères

Bonjour,

Je suis débutant en VBA. Jusqu'à présent j'ai réussi à faire deux trois codes VBA grâce au forum . Toutefois, cette fois ci j'aurais besoin d'un coup de main.

Je vais tenter d'expliquer au mieux mon problème. Sur ma feuille Excel, colonne A, je souhaite concatener des lignes sur la colonne B.

La Colonne A se présente comme cela :

240

La maison

est rouge

241

La maison

est

bleue

242

La maison est verte

243

Résultat Colonne B

La maison est rouge

La maison est bleue

La maison est verte

J'ai bien une formule excel, qui fonctionne bien (juste pour deux lignes) :

=SI(ESTNUM(A214);SI(ESTNUM(A217);CONCATENER(A215;" ";A216);" ");A215)

Mais je souhaiterais l'avoir en VBA.

Merci de votre aide.

Bonjour,

Une proposition

Sub Concatener()
Dim Cel As Range
Dim Ligne As Long
Dim Texte As String
    Ligne = 1
    With Worksheets("Feuil1")
        For Each Cel In .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row)
            If IsNumeric(Cel) Then
                If Cel.Row > 1 Then
                    Range("B" & Ligne) = Texte
                    Ligne = Ligne + 1
                    Texte = ""
                End If
            Else
                Texte = Texte & " " & Cel
            End If
        Next Cel
        Range("B" & Ligne) = Texte
    End With
End Sub
144exemple.zip (10.38 Ko)

A+

Salut Frangy

Merci beaucoup ça fonctionne très bien ! Je te remercie beaucoup

J'essaie de comprendre le code, mais je n'y arrive pas complétement.

Pourrais-tu m'aider à mettre des phrases sur le code ? Pour voir la logique.

Donc au début, tu définis les variables Sub, Cel, Ligne Text. Ok. Tu définis la première ligne comme numéro 1 et puis tu définis sur quelle feuille le code va marcher. Ok.

Là ça commence à se corser. Pour chaque cellule se trouvant dans la colonne A ... puis ".Range("A" & Rows.Count).End(xlUp).Row" je n'arrive pas à me faire une phrase là-dessus. (peut-être il doit compter la ligne et ensuite ctrl flèche haut ?)

Puis on met les conditions : si c'est numérique, et si la ligne > 1 alors

La première cellule de B sera le texte.

On incrémente d'un point le numéro de ligne

Et on efface le prochain texte (?)

Sinon on définit le texte dans la cellule B.

Désolé, ça paraît bête et très mal formulé, mais j'essaie juste de comprendre la logique. Je vois pas la boucle dans le code.

En tout cas merci bcp pour le code, et l'aide )

Quelques explications pour que tout cela devienne limpide

.Range("A" & Rows.Count).End(xlUp).Row

correspond à la dernière ligne renseignée dans la colonne A.

Tu peux visualiser le résultat , en te positionnant sur la dernière ligne de la colonne A puis en appuyant sur <fin> et <flêche haut>.

Range("A" & Rows.Count) correspond à la cellule A65536 sur un fichier Excel 2003 (extension xls).

End(xlUp) correspond à l'appui sur <fin> et <flêche haut>.

La boucle est définie par l'instruction For...Next.

Je t'indique tout d'abord la méthodologie et tu retrouveras l'adaptation dans les commentaires du code.

On balaye l'ensemble des cellules renseignées de la colonne A.

Exception faite de la première cellule (valeur 240), si la valeur est numérique c'est que le texte est complet et peut être écrit dans la colonne B.

Si la valeur n'est pas numérique la valeur de la cellule vient compléter le texte.

Exemple de traitement pour les premières lignes :

Ligne 1 : valeur 240. La valeur est numérique mais comme il s'agit de la première ligne, on ne fait rien

Ligne 2 : valeur "La maison". On affecte cette chaine de caractères à la variable "Texte".

Ligne 3 : valeur "est rouge". On concatène cette chaine de caractères à celui de "Texte". Résultat : "La maison est rouge".

Ligne 4 : valeur 241. La valeur est numérique et la ligne > 1 alors on écrit le texte dans la cellule B1. On incrémente le numéro de ligne pour préparer la prochaine écriture dans la colonne B. On réinitialise "Texte".

Idem pour les lignes suivantes.

En fin de traitement, la variable "Texte" contient le dernier texte à copier. Comme on ne rencontrera plus de valeur numérique, on termine donc en forçant l'écriture avec Range("B" & Ligne) = Texte.

    With Worksheets("Feuil1")
        'Balayage de chaque cellule renseignée dans la colonne A
        For Each Cel In .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row)
            'Si la valeur de la cellule est numérique
            If IsNumeric(Cel) Then
                'Si le numéro de la ligne est supérieur à 1
                If Cel.Row > 1 Then
                    'On écrit le texte complet dans la colonne B
                    Range("B" & Ligne) = Texte
                    'On incrémente le numéro de ligne
                    Ligne = Ligne + 1
                    'On réinitialise le texte
                    Texte = ""
                End If
            Else
                'On concatène le texte
                Texte = Texte & " " & Cel
            End If
        Next Cel
        'On ecrit le texte complet dans la colonne B
        Range("B" & Ligne) = Texte
    End With

A+

Salut Frangy,

C'est super ! ça a été un très grand plaisir de lire les explications ! Merci beaucoup

Finalement c'est un verre qu'on remplit et qu'on vide si les conditions sont vraies.

J'aurais une petite dernière question ou conseil. Comment apprendre le vocabulaire VBA et voir des exemples concrets ?

Sur le site il y a des cours VBA, mais y-a-t-il qqch de plus complet ? Un livre ? Un site ?

Merci encore

A titre personnel, j’ai utilisé un livre connu sous le nom de « Bible VBA pour Microsoft Office 2007 » qui m’a apporté les bases utiles puis j’ai exploré quelques sites pour profiter des tutoriels proposés.

Après, c’est surtout la pratique qui fait la différence. A force de se casser les dents sur les problèmes on finit par apprendre à les résoudre. De plus, les forums sont là pour donner de bons conseils (Excel-Pratique en tête bien sûr ).

Bon courage !

A+

bonjour je me présente SAM et une grosse migraine loll

je reviens vers vous vu divers résultat sur le sujet concaténer et autres !

mon problème est le suivant j'ai dans la colonne A mes références qui parfois sont identiques (donc le critère ) et dans la colonne D des couleurs d'articles qui parfois sont identiques ( le piégeeeeeeeeee lol )

j'aimerais si possible pourvoir avoir en colonne F par exemple l'ensemble des couleurs sur une même ligne et sans les doublons.

voila voila !!!

je vous remercie d'avance d'avoir pris le temps de lire mon message. dans l'attente de pouvoir vous lire

cordialement

ps: ci-joint un fichier exemple

57cataloguetest.xlsx (7.82 Ko)

Merci encore

A++

PS : Sam je vais regarder, mais je suis également débutant

PS : Peut-être, il serait mieux d'ouvrir un autre sujet avec ta question. Il y aura + de personnes.

apparemment frangy a l'air de toucher sa bille pas comme moi mdrrrrr

bon je vais boire une cht'i biere loll

Bonjour sam62,

En règle générale, il n'est pas souhaitable de squatter le post des copains

De plus, je ne trouve pas normal de toucher ma bille pendant que tu bois une cht'i bière.

Cela dit, voici quand même une proposition

104cataloguetest.xlsm (18.75 Ko)

A+

ouaww c'est beauuuuuuuu !!! j'ai l'impression d'être le petit bonhomme jaune a 3 yeux dans toy's story

je reste persuadé que vous ne vivez pas sur la même planète

mon dieu !!!! ce n'est pas Frangy mais Zorg !!!!

ps: j'ai 42 ans mais je connais mes classiques !!!! hein !!!!


oui alors LA Liliane !!!! moi José je ne comprend plus ça me dépasse !! mais ! mais ! mais alors ou on va, je vous le demande ?

bref merci Frangy pour cette claque intellectuel

mais pour enfoncer le clou j'ai vu le fichier et au magique !!!! Liliane regarde un gros bouton et pas de formule ou macro en vu

donc en gros j'ai fait mon José !!! j'ai rien compris !!!

Bonjour,

Si j'ai bien compris, tu ne maitrises pas vraiment VBA .

Je vais tenter de t'expliquer la méthode mais il va falloir s'accrocher.

Effectivement, il n'y a pas de macro à proprement parler.

Il s'agit d'une procédure qui se trouve dans le module de la Feuil1.

Pour visualiser cette procédure, tu dois d'abord ouvrir l'éditeur en appuyant sur Alt + F11.

Ensuite, ouvrir l'explorateur de projets en appuyant sur Ctrl+ R.

Un double clic sur le module Feuil1 (Feuil1) fera apparaitre le code.

Voici ce code commenté

Private Sub Test_Click()
Dim Dico, k, i
Dim n As Integer
Dim C As Range
    'On désactive l'actualisation d'écran
    Application.ScreenUpdating = False
    'On déclare un dictionnaire;
    'Ce dictionnaire va permettre de créer la liste de références sans doublons (clés);
    'De plus, on associera les couleurs à cette clé  (item).
    'Au final, on obtiendra un ensemble de couples clé-Item correspondant aux couples Référence-Couleurs.
    'Exemple de couple : 907 / Noir, Beige, Chair
    Set Dico = CreateObject("Scripting.dictionary")
    'On balaye toutes les références dans la colonne A
    For Each C In Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
        'Si la référence est absente du dictionnaire
        If Not Dico.Exists(C.Value) Then
            'alors, on note cette référence dans le dictionnaire (nouvelle clé)
            'et on lui associe la couleur (nouvel item)
            Dico.Add C.Value, C.Offset(0, 3).Value
        Else
            'sinon, la référence ayant déjà été notée,
            'si la couleur n'a pas encore été associée à cette référence
            If InStr(Dico.Item(C.Value), C.Offset(0, 3).Value) = 0 Then
                'alors, on ajoute cette couleur à l'item
                Dico.Item(C.Value) = Dico.Item(C.Value) & ", " & C.Offset(0, 3).Value
            End If
        End If
    Next C
    'On déclare la variable k pour accéder aux clés (références)
    k = Dico.keys
    'On déclare la variable i pour accéder aux items (couleurs associées)
    i = Dico.items
    'On balaye toutes les clés
    For n = 0 To Dico.Count - 1
        'On compare la valeur de la clé à chaque référence de la colonne A
        For Each C In Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
            'Si les 2 valeurs sont identiques, on copie les couleurs associées en colonne F
            If C.Value = k(n) Then C.Offset(0, 5) = i(n)
        Next C
    Next n
End Sub

J'espère que ces quelques explications suffiront pour t'éclairer (je vois déjà un oeil qui brille).

Bon courage !

A+

30cataloguetest.xlsm (20.12 Ko)

bonjour,

et encore merci !

je vais surtout essayer de comprendre pour la reproduire sur d'autres feuilles loll

bonjour,

ohhhhh grand maître !!!! dit le p'tit bonhomme a 3 yeux !!!!

Alors j'ai compris pour la zone référence ( a2:a ) ok mais je vois pas ou modifier si je désire changer la colonne E (couleur ou autres ) et l'écrire sur G ou autres. Et si j'ai bien compris pas sur lol la colonne K et I doit rester vide pour que la formule puisse travailler

verdict !!!


si j'ai pour E et F C.offset(0, 3) 3 étant E idem pour F étant 5 8)

Après test j'ai vu une chose si par exemple je prend dans la liste non pas des couleurs mais des tailles (ex: xl, xxl, s, etc. ) la formule prend en compte xxl mais pas xl car pour la formule xl est un doublon !

hahaha ... je suis sur qu'il y a un quatrième oeil qui va pousser ... hahaha

mais bon à mon niveau cela me suffit et marche nikel encore merci à tous

Rhooooo la morale de l'histoire c'est que le monde change pas vraiment ! hein ! quand tu as un coup de P**te avec un fichier qui te t'embête rien de tel qu'un(e) Macro pour régler le problème et donc il faut reconnaitre qu'il "Excel" au final

Bonnn oki je sors !!!!!

Bonjour,

J'ai publié ce matin sur le site afin d'avoir de l'aide sur une thématique qui se rapproche de celle ci, je vous mets le lien ci dessous dans le cas où certains voudraient m'aider.

Je vous en remercie.

https://forum.excel-pratique.com/viewtopic.php?f=2&t=136796#top

Bonjour,

J'ai publié ce matin sur le site afin d'avoir de l'aide sur une thématique qui se rapproche de celle ci, je vous mets le lien ci dessous dans le cas où certains voudraient m'aider.

Je vous en remercie.

https://forum.excel-pratique.com/viewtopic.php?f=2&t=136796#top

Bonjour,

Je me permets de m'incruster, j'ai publié ce matin sur le site afin d'avoir de l'aide sur une thématique qui se rapproche de celle ci, je vous mets le lien ci dessous dans le cas où certains voudraient m'aider.

Je vous en remercie.

viewtopic.php?f=2&t=136796#top

Rechercher des sujets similaires à "vba concatener criteres"