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
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 WithA+
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
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
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 SubJ'espère que ces quelques explications suffiront pour t'éclairer (je vois déjà un oeil qui brille).
Bon courage !
A+
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
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