MACRO Comment lister dans une seule cellule

Résolu/Fermé
LysdElise - 20 oct. 2010 à 18:01
 LysdElise - 27 oct. 2010 à 00:52
Bonjour

Comment lister dans une seule cellule toutes les infos qui se trouvent dans la colonne B si le valeur référence est trouvée. (I c'est la séparation entre les cellules)

exemple:
col. A I col.B .
x I A .
y I B .
z I C .
x I D .
y I E .
z I F .
z I G .


le résultat que je souhaite d'obtenir est le suivant :
x I A , D .
y I B , E .
z I C , F , G .


Dans mon cas, le macro est indispensable car le nombre des valeurs dans la colonne A et B peut être infini. Il faudra donc encore avoir la formule qui va vérifier si la cellule suivant dans la colonne A est vide. Si elle est vide END SUB.

Il s'agit d'EXCEL 2003.

Merci d'avance pour votre aide.
EL

10 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
20 oct. 2010 à 19:27
Bonsoir,

à essayer pour un grand nombre de lignes

Const col As Byte = 1 'colonne des ref
Const lig As Byte = 2 'ligne de départ
Const col_r As Byte = 4 'colonne de restitution

Sub regrouper_par_ref()
Dim derlig As Long, cptr As Long
Dim ref 'dépend du type de ref (string ?)
Dim dico_ref As Object
Dim liste, tablo
Dim concat As String, lig_ref As Long, cptr_lig As Integer

derlig = Cells(65536, col).End(xlUp).Row
 Set dico_ref = CreateObject("Scripting.Dictionary")
 
 'crée une liste des ref sans doublons
 For cptr = lig To derlig
    ref = Cells(cptr, col)
     If Not dico_ref.Exists(ref) Then
            dico_ref.Add ref, ref
    End If
 Next
 liste = dico_ref.items
 
 ReDim tablo(UBound(liste), 1)
 
 For cptr = 0 To UBound(liste)
    concat = ""
    ref = liste(cptr) 'ref en cours
    tablo(cptr, 0) = ref
    
    nbre = Application.CountIf(Columns(col), ref)
    If lig = 1 Then
        lig_ref = 65536
    Else
        lig_ref = lig - 1
    End If
    'concaténète les données de m^ ref
    For cptr_lig = 1 To nbre
        'recherche les ligne de la ref en cours
        lig_ref = Columns(col).Find(ref, Cells(lig_ref, col), xlValues).Row
        concat = concat & " " & Cells(lig_ref, col + 1) & " ."
        tablo(cptr, 1) = concat 'inscrit la concaténation dans la tableau
    Next
 Next
 
 'restitution
 Application.ScreenUpdating = False
 Range(Cells(lig, col_r), Cells(65536, col_r + 1)).ClearContents
 Cells(lig, col_r).Resize(UBound(tablo) + 1, 2) = tablo
End Sub

0
Bonjour Michel,
Merci. Je ne suis pas trop expérimentée dans les macros, je vais donc prendre le temps pour adapter le code a mes donnes et le tester. Je te tiendrai au courant.
A+
0
Bonsoir Michel,
MERCI ! Ton code marche à merveille mais j'ai besoin de le comprends et de l'adapter a mes donnes. Par contre j'ai mal adapté mon question-exemple. J'ai les doublons surtout dans la colonne B, je souhaiterai donc éviter de les lister tous (je souhaiterai les lister juste une fois). Comment le faire ?
Merci d'avance.
A+
Eliz
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 21/10/2010 à 11:35
Bonjour,

la modif est en gras

...  
'concaténète les données de m^ ref  
For cptr_lig = 1 To nbre  
        'recherche les ligne de la ref en cours  
        lig_ref = Columns(col).Find(ref, Cells(lig_ref, col), xlValues).Row  
        donnee = Cells(lig_ref, col + 1)  
        If InStr(concat, donnee) = 0 Then 'teste si la donnée n'est pas déjà inscrite  
            concat = concat & " " & donnee & " ."  
            tablo(cptr, 1) = concat 'inscrit la concaténation dans la tableau  
        End If  
    Next  
...

n'oublie pas de déclarer "donnee"

edit: attention! si tu as par exemple comme données "azerty" puis "azer" , le code considère qu'il s'agit d'un doublon (tu ne donnes aucun renseignement sur la forme de tes données...)

bonne journée
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
22 oct. 2010 à 09:46
Pas de nouvelles ?

Abandon définitif du suivi; refus d'aide futur pour LysdElise
0
Bonjour Michel,
Pas de nouvelles pour le moment parce que je suis tellement inexpérimentée avec des macros que j'ai besoin d'attendre une session avec un ami afin de comprendre ton code et de l'adapter a mes donnes. C'est plus compliqué que j'ai pensé. Par instant je laisse la discussion ouverte parce que je pourrai avoir encore des questions. Je te tiendrai au courant. Et toujours merci pour ton aide.
A+, Elisa
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour Michel,

En fait mon problème est :

*Dans la col.A j'ai la valeur cherchée = code de commande en format txt (normalement il n'y a pas des doublons mais le formule qui enlève les doublons peut rester par sécurité)
*Dans la col.B j'ai le numéro de livraison le quel peut être en format txt ou num (il y a les doublons à enlever)
*Dans la col.C j'ai la date de livraison en format txt (il y a les doublons à enlever)

Le résultat que je souhaite d'obtenir est le suivant :

*Dans la col.D le code de commande (normalement sans les doublons)
*Dans la col.E liste de valeurs de la col.B - liste de numéros de livraison (sans les doublons)
*Dans la col.F liste de valeurs de la col.C - des dates de livraison (sans les doublons)

Auras-tu la gentillesse de m'aider encore une fois, stp ?
Le reste de mes donnes je devrais pouvoir adapter toute seule, comme une grande ;)

A+,Elise
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
22 oct. 2010 à 18:42
je n(ai plus ce truc en tête mais ta demande était sur 2 colonnes et tu me dis maintenant 3 colonnes... pourquoi ne l'avoir pas dit au départ ?
D'autre part j'émettais un doute sur le traitements des doublons en 2° colonne (azerty puis azer) si tu as des nombres, ce sera pareil avec 12345 puis 123...(mais pas avec 1237 ni azerh)

donc
1/regarde ces points
2/ vérifie que tu n'oublies rien ce coup ci dans ta demande
une solution VBA est à 99% unique et demande un"cahier des charges" complet et précis
au besoin met en PJ quelques lignes ( env.100)de ton classeur sans données confidentielles
pour une pièce jointe
http://cijoint.fr/
et colles le lien proposé dans ton message

0
Bonsoir Michel,
Voila j'ai posté mon question avec les donnes dans :

http://www.cijoint.fr/cjlink.php?file=cj201010/cijhfPHoCl.xls

A+,Elisa
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 23/10/2010 à 18:56
Bonjour Elisa,
Ci joint tableau avec 3 colonnes
http://www.cijoint.fr/cjlink.php?file=cj201010/cijyASCOsk.xls
j'ai annoté ta présentation bravo pour sa clarté et sa précision ;-)


edit à env 19h:

en rentrant et après des bidouillages , ne faudrait il pas en fait lier le po_pos et sa date (doublon ou pas) pour des questions de lisibilité ? je ne saisis pas bien l'intér^t d'avoir pour un code une liste de po_pos dans une colonne et une liste de dates dans une autre apparemment sans rapport

tu dis...
0
Bonjour Michel,
Merci bcp pour ton code. Il est superbe !
Malheureusement je ne suis pas en formation VBA. J'ai juste trouvé un ami qui connait en peu vba et qui m'a décrypté ton code. Par contre on n'a pas compris comment dans le premier code la ligne de départ était définis 2 mais ton code a aussi traité la ligne 1 ?

Mon ami a appris la programmation a l'école. Moi aussi, mais j'étais nulle et c'était turbo pascal. Maintenant j'ai besoin et envie de faire des choses dans XL mais comme tu as vu je me bloque sur les choses presque banales. Heureusement qu'il y a les gens comme toi qui aide. Encore une fois merci.

PS : edit à env 19h:

En fait ca sera encore mieux de lister le numéro et sa date dans la même cellule. Ca permettra de faire des énormes économies de place dans ma matrice... mais encore fois je ne sais pas comment le faire : (
Et encore une fois on en est la, parce que comme je n'ai pas sût comment résoudre ma difficulté, j'ai détricoté mon problème jusqu'aux opérations de base sur les 2 cellules et j'ai testé les possibilités « concatenate if » malheureusement sans résultats satisfaisants. Après j'ai terminé sur le forum avec l'exemple simpliste. Comme on n'est pas bon en VBA on essaye faire ce qu'on peut avec.

Mon XL il est bcp plus compliqué que juste la liste des donnes dans une cellule. Je construis un simulateur des scenarii futures et en cas des incidents je pourra visualiser le détail de l'incident comme son numéro et sa date. Par instant je suis dans le période de conception d'approche et je n'ai pas encore reçu tout les donnes que je souhaite de traiter. C'est pourquoi j'ai constitué les donnes de test différents et avec bcp des doublons. En réalité, je ne pense pas qu'il aura bcp des doublons dans ma simulation. Et les informations listées seront juste un départ pour une autre action qui ne concerne pas ma simulation. Si tu veux en discuter plus hors forum tu pourra me donner ton e-mail.
A+,Elise
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 26/10/2010 à 11:01
Bonjour (ou bonsoir),

ca sera encore mieux de lister le numéro et sa date dans la même cellule
OK, c'est fait; la taille des colonnes est calculée pour rentrer sur 1 A4 vertical avec des marges verticales de 1cm

je ne pense pas qu'il aura bcp des doublons dans ma simulation
j'ai donc supprimer le test "doublon"

Par contre on n'a pas compris comment dans le premier code la ligne de départ était définis 2 mais ton code a aussi traité la ligne 1 ?
j'ai mis "lig" (et les colonnes) en constante pour pouvoir faire évoluer facilement l'appli afin d'éviter d'aller trifouiller dans le code.
La fonction find recherche après une cellule de départ; syntaxe d'école find(what:=ref,after:=cells(lig,col)...
il faut donc tester si lig=1 la cellule de départ est donc la cellule d'avant soit 65536; sinon on affecte lig-1

Si tu veux en discuter plus hors forum tu pourra me donner ton e-mail.

tu peux t'inscrire sur CCM: il y a un système de message personnel. mais je ne répond pas à des questions techniques en MP sauf si problème de confidentialité.

la bête:
http://www.cijoint.fr/cjlink.php?file=cj201010/cijfyBwokg.xls

cordialement, @+
Michel
0
Merci Michel pour la bete !
A+
Elise
0