Concatenation de plusieurs lignes avec condition
bonjour a tous
tout d'abord je suis tout nouveau inscrit sur le forum même si je le consulte régulièrement
ma connaissance d'excel se limite a quelques formules et un peu de macro
après plusieurs heures a chercher sur les forum je me suis décider a m'inscrire et a poster ma demande
changeant de logiciel erp je doit récupérer mes données exportées sur excel
mon ancien logiciel exporte les libelles par tranche de 20 caractères par ligne
le but est de concaténer ces lignes en une seule cellule sous condition du mème code article
colonne E = code article
colonne I = libellés a concaténer
si je ne suis pas assez clair n’hésiter pas a me demander des explications supplémentaires
merci d'avance pour pour votre aide
en espérant ne pas avoir été trop long sur ce post (pas l’habitude)
Bonjour,
Testes ceci pour voir.
Le résultat de la concaténation sera inscrit en colonne E et i sous le tableau :
Sub Test()
Dim Dico As Object
Dim Cle As Variant
Dim Plage As Range
Dim Cel As Range
Dim I As Long
Set Dico = CreateObject("Scripting.Dictionary")
'défini la plage sur la colonne E
With Worksheets("Anciennes_donnees"): Set Plage = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With
'concatène en fonction du code article
For Each Cel In Plage: Dico(Cel.Value) = Dico(Cel.Value) & " " & Cel.Offset(, 4).Value: Next Cel
'inscrit le résultat deux lignes en dessous de la colonne des libellés (colonne I)
I = Plage.Count + 2
For Each Cle In Dico.Keys
I = I + 1
With Worksheets("Anciennes_donnees")
.Cells(I, 9).Value = Dico(Cle)
.Cells(I, 5).Value = Cle
End With
Next Cle
End Sub
bonjour Theze :
géniale merci pour ta réponse aussi rapide
je viens de tester le code et cela marche du tonner
j'ai fait des essais avec plus de ligne d'importation et cela marche de la même manière
a savoir que en gros j'aurai autour de 10000 lignes
le seul bémol s'est la présentation
si j’osai je te ferai une demande supplémentaires pour plus de clarté sur le fichier
ci joint le fichier après la macro et un copié collé a l'emplacement idéale pour la concaténation
encore merci et si cela t’embête de trop ce n'est pas grave je ferai avec ce qui est déjà formidable
Re,
A tester :
Sub Test()
Dim Dico As Object
Dim Cle As Variant
Dim Plage As Range
Dim Cel As Range
Dim Adr As String
Set Dico = CreateObject("Scripting.Dictionary")
With Worksheets("Anciennes_donnees")
'défini la plage sur la colonne E...
Set Plage = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp))
'...et vide la colonne J
.Columns(10).Clear
End With
'concatène en fonction du code article
For Each Cel In Plage
'si le code article n'existe pas encore, stocke en début de texte l'adresse
'de la cellule située en colonne J décalée d'une ligne vers le haut
'(code article en E2, mémorise J1) sinon, concatène
If Dico.exists(Cel.Value) = False Then
Adr = "<" & Cel.Offset(-1, 5).Address(0, 0) & ">"
Dico(Cel.Value) = Adr & Cel.Offset(, 4).Value
Else
Dico(Cel.Value) = Dico(Cel.Value) & " " & Cel.Offset(, 4).Value
End If
Next Cel
'inscrit le résultat en colonne J
For Each Cle In Dico.Keys
'extrait l'adresse de la cellule où doit être mis le résultat de la concaténation
Adr = Split(Dico(Cle), ">")(0)
Adr = Right(Adr, Len(Adr) - 1)
'inscrit le texte et mets le retour à la ligne automatique
With Worksheets("Anciennes_donnees")
.Range(Adr).Value = Split(Dico(Cle), ">")(1)
.Range(Adr).WrapText = True
End With
Next Cle
End Sub
génial
encore merci ton travail va me faire gagner un sacré temps
maintenant je n' hésiterai plus a poster une demande si je galère de trop
a plus tard peut être
Bonjour,
Content de t'avoir aidé