MACRO Comment lister dans une seule cellule

Résolu
LysdElise -  
 LysdElise -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. LysdElise
     
    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
  3. LysdElise
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Pas de nouvelles ?

      Abandon définitif du suivi; refus d'aide futur pour LysdElise
      0
  4. LysdElise
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. LysdElise
     
    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
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  8. LysdElise
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  9. LysdElise
     
    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
  10. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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